diff --git a/.gitignore b/.gitignore
index 8d2f03403d0b11b299998dd032292e860bb4d3d0..4fe20d8ca811ca883188b6ecedac129e0a334af2 100644
--- a/.gitignore
+++ b/.gitignore
@@ -12,7 +12,8 @@ profiling/*
 !profiling/*-header
 !profiling/kinds.json
 *.log
-*.png
+pngs/*.png
+pdfs/*.pdf
 .ipynb_checkpoints/
 /.tmp
 /m_*.tar
diff --git a/ilp-measurement.ipynb b/ilp-measurement.ipynb
index ce6a712aecd4a8e24ad9635c43f88e9964d22b75..9c33d2fc051b0e533334ae3b76ced818fb849cf7 100644
--- a/ilp-measurement.ipynb
+++ b/ilp-measurement.ipynb
@@ -18,7 +18,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 15,
+   "execution_count": 2,
    "metadata": {
     "collapsed": false
    },
@@ -39,10 +39,15 @@
    },
    "outputs": [],
    "source": [
-    "if not os.path.exists('doc'):\n",
-    "    os.mkdir('doc')\n",
-    "if not os.path.exists('pngs'):\n",
-    "    os.mkdir('pngs')"
+    "_pngpath, _pdfpath = 'pngs/', 'pdfs/'\n",
+    "if not os.path.exists(_pngpath):\n",
+    "    os.mkdir(_pngpath)\n",
+    "if not os.path.exists(_pdfpath):\n",
+    "    os.mkdir(_pdfpath)\n",
+    "def pngpath(filename):\n",
+    "    return _pngpath + filename + '.png'\n",
+    "def pdfpath(filename):\n",
+    "    return _pdfpath + filename + '.pdf'"
    ]
   },
   {
@@ -294,7 +299,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 61,
+   "execution_count": 13,
    "metadata": {
     "collapsed": false,
     "scrolled": false
@@ -360,7 +365,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 17,
+   "execution_count": 14,
    "metadata": {
     "collapsed": false,
     "scrolled": true
@@ -378,7 +383,7 @@
       "Loaded 1928 record(s) for update_glpk (8x31 unique) ~= 7 run(s)\n",
       "Loaded 241 record(s) for sw_glpk (7x31 unique) ~= 1 run(s)\n",
       "Traceback (most recent call last):\n",
-      "  File \"<ipython-input-17-a9613a72d048>\", line 3, in <module>\n",
+      "  File \"<ipython-input-14-a9613a72d048>\", line 3, in <module>\n",
       "    glpk_dats      = read_sol_results('glpk')\n",
       "  File \"<ipython-input-11-3738473b7378>\", line 5, in read_sol_results\n",
       "    splitted = split_change_only)\n",
@@ -407,7 +412,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 18,
+   "execution_count": 15,
    "metadata": {
     "collapsed": true
    },
@@ -420,7 +425,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 19,
+   "execution_count": 16,
    "metadata": {
     "collapsed": false,
     "scrolled": false
@@ -475,8 +480,8 @@
     "        f.subplots_adjust(hspace=0.2)\n",
     "        plt.setp([a.get_xticklabels() for a in f.axes[:-3]], visible=False)\n",
     "        plt.setp([a.get_yticklabels() for a in f.axes], visible=True)\n",
-    "        plt.savefig('doc/{}.pdf'.format(name), facecolor=f.get_facecolor(), edgecolor='none')\n",
-    "        plt.savefig('pngs/{}.png'.format(name), facecolor=f.get_facecolor(), edgecolor='none')\n",
+    "        plt.savefig(pdfpath(name), facecolor=f.get_facecolor(), edgecolor='none')\n",
+    "        plt.savefig(pngpath(name), facecolor=f.get_facecolor(), edgecolor='none')\n",
     "    except Exception as e:\n",
     "        print 'Error while drawing gen in {0}-{1}: {2}'.format(change, strategy, e)\n",
     "        traceback.print_exc(file=sys.stdout)\n",
@@ -486,7 +491,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 20,
+   "execution_count": 17,
    "metadata": {
     "collapsed": false
    },
@@ -535,8 +540,8 @@
     "        f.subplots_adjust(hspace=0.2)\n",
     "        plt.setp([a.get_xticklabels() for a in f.axes[:-3]], visible=False)\n",
     "        plt.setp([a.get_yticklabels() for a in f.axes], visible=True)\n",
-    "        plt.savefig('doc/{}.pdf'.format(name))\n",
-    "        plt.savefig('pngs/{}.png'.format(name))\n",
+    "        plt.savefig(pdfpath(name))\n",
+    "        plt.savefig(pngpath(name))\n",
     "    except Exception as e:\n",
     "        print 'Error while drawing sol in {0}: {1}'.format(changeName, e)\n",
     "        traceback.print_exc(file=sys.stdout)\n",
@@ -546,7 +551,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 21,
+   "execution_count": 18,
    "metadata": {
     "collapsed": false,
     "scrolled": true
@@ -567,8 +572,8 @@
     "        plt.legend(loc = 'right')\n",
     "        plt.ylabel('seconds')\n",
     "        plt.suptitle('ILP Solving Time - Comparison', fontsize = 16)\n",
-    "        plt.savefig('doc/{}.pdf'.format(name))\n",
-    "        plt.savefig('pngs/{}.png'.format(name))\n",
+    "        plt.savefig(pdfpath(name))\n",
+    "        plt.savefig(pngpath(name))\n",
     "    except Exception as e:\n",
     "        print 'Error while drawing comp-sol in {0}: {1}'.format(changeName, e)\n",
     "        traceback.print_exc(file=sys.stdout)\n",
@@ -578,7 +583,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 22,
+   "execution_count": 19,
    "metadata": {
     "collapsed": true
    },
@@ -632,7 +637,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 23,
+   "execution_count": 20,
    "metadata": {
     "collapsed": true
    },
@@ -659,42 +664,64 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 24,
+   "execution_count": 30,
    "metadata": {
     "collapsed": false
    },
    "outputs": [],
    "source": [
-    "def setBoxColors(bp, c, c2 = None, apply_to = None, newstyle = False, linewidth=2):\n",
-    "    if newstyle:\n",
-    "        if c2 is None:\n",
-    "            c2 = 'white' if c in ('black', 'blue') else 'black'\n",
-    "        for box in bp['boxes']:\n",
-    "            box.set(facecolor = c, linewidth=linewidth)\n",
-    "        for median in bp['medians']:\n",
-    "            median.set(color=c2, linewidth=linewidth)\n",
-    "        for whisker in bp['whiskers']:\n",
-    "            whisker.set(ls = 'dotted', color='black')\n",
-    "        return\n",
-    "    if c2 is None:\n",
-    "        c2 = c\n",
-    "    set_c  = functools.partial(plt.setp, color=c)\n",
-    "    set_c2 = functools.partial(plt.setp, color=c2)\n",
-    "    elems_c  = ['boxes', 'caps', 'whiskers', 'fliers']\n",
-    "    elems_c2 = ['medians']\n",
-    "    if apply_to is None:\n",
-    "        # apply to all\n",
-    "        for elem in elems_c:\n",
-    "            set_c(bp[elem])\n",
-    "        for elem in elems_c2:\n",
-    "            set_c2(bp[elem])\n",
-    "    else:\n",
-    "        for elem in elems_c:\n",
-    "            set_c(bp[elem][apply_to])\n",
-    "        for elem in elems_c2:\n",
-    "            set_c2(bp[elem][apply_to])\n",
-    "strategy_colors = {'noncached':'yellow', 'flush': 'cyan', 'normal': 'blue'}\n",
-    "strategy_colors.update({k:('black', 'red') for k in ('NormalToFlushed', 'NormalToNoncached', 'FlushedToNoncached')})"
+    "box_facecolor, median_color, box_edgecolor, whisker_color, average_color = range(5)\n",
+    "def setBoxColors(bp, colors, apply_to = None, linewidth=2):\n",
+    "    for box in bp['boxes']:\n",
+    "        box.set(facecolor = colors[box_facecolor], linewidth=linewidth, edgecolor= colors[box_edgecolor])\n",
+    "    for median in bp['medians']:\n",
+    "        median.set(color=colors[median_color], linewidth=linewidth)\n",
+    "    for whisker in bp['whiskers']:\n",
+    "        whisker.set(ls = 'dotted', color=colors[whisker_color])\n",
+    "# strategy: (box.facecolor, median.color, box.edgecolor, whisker.color)\n",
+    "strategy_colors = {'noncached':('yellow','black','black', 'black', 'black'),\n",
+    "                   'flush': ('cyan','black','black', 'black', 'black'),\n",
+    "                   'normal': ('blue', 'white', 'blue', 'black', 'black')}\n",
+    "strategy_colors.update({k:('black', 'red') for k in ('NormalToFlushed', 'NormalToNoncached', 'FlushedToNoncached')})\n",
+    "def draw_average_line(y, c):\n",
+    "    plt.axhline(y, ls = '-', color = c, zorder = 1, linewidth=2)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 22,
+   "metadata": {
+    "collapsed": false,
+    "scrolled": true
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "update normal 1.77210853495\n",
+      "update flush 10.7880389785\n",
+      "update noncached 9.96998723118\n",
+      "sw normal 9.44708971546\n",
+      "sw flush 11.3443110599\n",
+      "sw noncached 13.7821516129\n",
+      "res normal 4.0042525181\n",
+      "res flush 7.77624654378\n",
+      "res noncached 9.03863824885\n",
+      "complex normal 2.04215702479\n",
+      "complex flush 4.21195867769\n",
+      "complex noncached 5.55057024793\n",
+      "mixed normal 3.41092375\n",
+      "mixed flush 22.4315775\n",
+      "mixed noncached 27.787\n"
+     ]
+    }
+   ],
+   "source": [
+    "for change in kinds['changes']:\n",
+    "    for strategy in kinds['strategies']:\n",
+    "        cdat = racket_dats[change][strategy]\n",
+    "        print change, strategy, np.average(cdat)"
    ]
   },
   {
@@ -706,7 +733,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 27,
+   "execution_count": 31,
    "metadata": {
     "collapsed": false,
     "scrolled": true
@@ -716,13 +743,33 @@
      "name": "stdout",
      "output_type": "stream",
      "text": [
+      "Draw_average =  True\n",
       "\n",
       "java:\n",
+      " update,normal,flush/,noncached/\n",
+      " sw,normal/,flush/,noncached/\n",
+      " res,normal/,flush/,noncached/\n",
+      " mixed,normal/,flush/,noncached/\n",
+      "\n",
+      "racket:\n",
       " update,normal,flush,noncached\n",
       " sw,normal,flush,noncached\n",
       " res,normal,flush,noncached\n",
       " mixed,normal,flush,noncached\n",
       "\n",
+      "larceny:\n",
+      " update,normal,flush/,noncached/\n",
+      " sw,normal,flush/,noncached/\n",
+      " res,normal,flush/,noncached/\n",
+      " mixed,normal/,flush/,noncached/\n",
+      "Draw_average =  False\n",
+      "\n",
+      "java:\n",
+      " update,normal,flush/,noncached/\n",
+      " sw,normal/,flush/,noncached/\n",
+      " res,normal/,flush/,noncached/\n",
+      " mixed,normal/,flush/,noncached/\n",
+      "\n",
       "racket:\n",
       " update,normal,flush,noncached\n",
       " sw,normal,flush,noncached\n",
@@ -730,42 +777,51 @@
       " mixed,normal,flush,noncached\n",
       "\n",
       "larceny:\n",
-      " update,normal,flush,noncached\n",
-      " sw,normal,flush,noncached\n",
-      " res,normal,flush,noncached\n",
-      " mixed,normal,flush,noncached\n"
+      " update,normal,flush/,noncached/\n",
+      " sw,normal,flush/,noncached/\n",
+      " res,normal,flush/,noncached/\n",
+      " mixed,normal/,flush/,noncached/\n"
      ]
     }
    ],
    "source": [
-    "for (data, name) in ((java_dats, 'java'), (racket_dats, 'racket'), (larceny_dats, 'larceny')):\n",
-    "    sys.stdout.write('\\n{}:'.format(name))\n",
-    "#    change, strategy = 'mixed', 'normal'\n",
-    "#    if True:\n",
-    "    for change in kinds['changes']:\n",
-    "        if change == 'complex':\n",
-    "            continue\n",
-    "        sys.stdout.write('\\n {}'.format(change))\n",
-    "#        if True:\n",
-    "        for strategy in kinds['strategies']:\n",
-    "            sys.stdout.write(','+strategy)\n",
-    "            cdat = data[change][strategy]\n",
-    "            bp = plt.boxplot(cdat.transpose(), patch_artist=True)\n",
-    "            setBoxColors(bp, strategy_colors[strategy], newstyle=True, linewidth=1)\n",
-    "            axes = plt.gca()\n",
-    "            axes.set_ylim([0,50])\n",
-    "#            plt.title('{0} {1} {2}'.format(name.title(), change_to_title(change), strategy_to_titel(strategy)))\n",
-    "            plt.ylabel('seconds')\n",
-    "            plt.xlabel('step')\n",
-    "            if change == 'mixed':\n",
-    "                for i, label in enumerate(axes.get_xticklabels()):\n",
-    "                    label.set_visible(i==0 or (i+1) % 10 == 0)\n",
-    "#            plt.gca().tick_params(axis='x', direction='out', top = 'off', bottom = 'on')\n",
-    "            plt.gca().tick_params(axis='x', top = 'off', bottom = 'off')\n",
-    "            plt.savefig('pngs/gen_bp_{0}_{1}_{2}.png'.format(name,change,strategy))\n",
-    "            plt.savefig('doc/gen_bp_{0}_{1}_{2}.pdf'.format(name,change,strategy))\n",
-    "            plt.close()\n",
-    "    print ''"
+    "for draw_average in (True, False):\n",
+    "    print 'Draw_average = ', draw_average\n",
+    "    for (data, name) in ((java_dats, 'java'), (racket_dats, 'racket'), (larceny_dats, 'larceny')):\n",
+    "        sys.stdout.write('\\n{}:'.format(name))\n",
+    "    #    change, strategy = 'mixed', 'normal'\n",
+    "    #    if True:\n",
+    "        for change in kinds['changes']:\n",
+    "            if change == 'complex':\n",
+    "                continue\n",
+    "            sys.stdout.write('\\n {}'.format(change))\n",
+    "    #        if True:\n",
+    "            for strategy in kinds['strategies']:\n",
+    "                sys.stdout.write(','+strategy)\n",
+    "                cdat = data[change][strategy]\n",
+    "                if cdat.size == 1:\n",
+    "                    sys.stdout.write('/')\n",
+    "                    continue\n",
+    "                colors = strategy_colors[strategy]\n",
+    "                if draw_average:\n",
+    "                    draw_average_line(np.average(cdat),colors[average_color])\n",
+    "                bp = plt.boxplot(cdat.transpose(), patch_artist=True)\n",
+    "                setBoxColors(bp, colors, linewidth=1)\n",
+    "                axes = plt.gca()\n",
+    "                axes.set_ylim([0,50])\n",
+    "    #            plt.title('{0} {1} {2}'.format(name.title(), change_to_title(change), strategy_to_titel(strategy)))\n",
+    "                plt.ylabel('seconds')\n",
+    "                plt.xlabel('step')\n",
+    "                if change == 'mixed':\n",
+    "                    for i, label in enumerate(axes.get_xticklabels()):\n",
+    "                        label.set_visible(i==0 or (i+1) % 10 == 0)\n",
+    "    #            plt.gca().tick_params(axis='x', direction='out', top = 'off', bottom = 'on')\n",
+    "                plt.gca().tick_params(axis='x', top = 'off', bottom = 'off')\n",
+    "                fname = 'gen_bp_{0}{1}_{2}_{3}'.format(name,'_avg' if draw_average else '',change,strategy)\n",
+    "                plt.savefig(pdfpath(fname))\n",
+    "                plt.savefig(pngpath(fname))\n",
+    "                plt.close()\n",
+    "        print ''"
    ]
   },
   {
@@ -777,7 +833,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 28,
+   "execution_count": 24,
    "metadata": {
     "collapsed": false,
     "scrolled": false
@@ -796,7 +852,7 @@
     "        sys.stdout.write('\\n {}'.format(change))\n",
     "        cdat = data[change]\n",
     "        bp = plt.boxplot(cdat.transpose(), patch_artist=True)\n",
-    "        setBoxColors(bp, 'black', newstyle=True, linewidth=1)\n",
+    "        setBoxColors(bp, 'black', linewidth=1)\n",
     "        axes = plt.gca()\n",
     "        axes.set_ylim([0,50])\n",
     "#            plt.title('{0} {1} {2}'.format(name.title(), change_to_title(change), strategy_to_titel(strategy)))\n",
@@ -807,8 +863,9 @@
     "                label.set_visible(i==0 or (i+1) % 10 == 0)\n",
     "#            plt.gca().tick_params(axis='x', direction='out', top = 'off', bottom = 'on')\n",
     "        plt.gca().tick_params(axis='x', top = 'off', bottom = 'off')\n",
-    "        plt.savefig('pngs/sol_bp_{0}_{1}.png'.format(name,change))\n",
-    "        plt.savefig('doc/sol_bp_{0}_{1}.pdf'.format(name,change))\n",
+    "        fname = 'sol_bp_{0}_{1}'.format(name,change)\n",
+    "        plt.savefig(pdfpath(fname))\n",
+    "        plt.savefig(pngpath(fname))\n",
     "        plt.close()\n",
     "    print ''"
    ]
@@ -822,7 +879,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 29,
+   "execution_count": 28,
    "metadata": {
     "collapsed": false
    },
@@ -831,49 +888,62 @@
      "name": "stdout",
      "output_type": "stream",
      "text": [
+      "Draw_average =  True\n",
       "\n",
       " update\n",
       " res\n",
-      " sw"
+      " sw\n",
+      "Draw_average =  False\n",
+      "\n",
+      " update\n",
+      " res\n",
+      " sw\n"
      ]
     }
    ],
    "source": [
     "width = 0.6\n",
     "name  = 'racket'\n",
-    "for change in ['update', 'res', 'sw']:#, 'mixed']:\n",
-    "#change = 'mixed'\n",
-    "#if True:\n",
-    "    sys.stdout.write('\\n {}'.format(change))\n",
-    "    invisibles = []\n",
-    "    for i, strategy in enumerate(['noncached', 'flush', 'normal']):\n",
-    "#    i, strategy = 1, 'flush'\n",
-    "#    if True:\n",
-    "        y = racket_dats[change][strategy]\n",
-    "        c = strategy_colors[strategy]\n",
-    "        bp = plt.boxplot(y.transpose(), patch_artist=True, positions = np.arange(y.shape[0])*4+i)\n",
-    "        setBoxColors(bp, c, newstyle=True)\n",
-    "#        line, = plt.plot([1,1],c[0]+'-')\n",
-    "        invisibles.append(mpatches.Patch(color=c, label=strategy_to_titel(strategy)))\n",
-    "    axes = plt.gca()\n",
-    "    y_len = y.shape[0]\n",
-    "    axes.set_ylim([0,50])\n",
-    "    plt.ylabel('seconds')\n",
-    "    plt.xlabel('step')\n",
-    "    if change == 'mixed':\n",
-    "        axes.set_xlim([-1,y_len*4+1])\n",
-    "        axes.set_xticklabels(range(0,111,10))\n",
-    "        axes.set_xticks(range(1,y_len*4+41,40))\n",
-    "    else:\n",
-    "        axes.set_xlim([-1,y_len*4-1])\n",
-    "        axes.set_xticklabels(range(1,y_len+1))\n",
-    "        axes.set_xticks(range(1,y_len*4,4))\n",
+    "for draw_average in (True, False):\n",
+    "    print 'Draw_average = ', draw_average\n",
+    "    for change in ['update', 'res', 'sw']:#, 'mixed']:\n",
+    "    #change = 'mixed'\n",
+    "    #if True:\n",
+    "        sys.stdout.write('\\n {}'.format(change))\n",
+    "        invisibles = []\n",
+    "        if draw_average:\n",
+    "            # draw horizontal lines first\n",
+    "            for strategy in ['noncached', 'flush', 'normal']:\n",
+    "                draw_average_line(np.average(racket_dats[change][strategy]), strategy_colors[strategy][average_color])\n",
+    "        # now draw boxplots in front\n",
+    "        for i, strategy in enumerate(['noncached', 'flush', 'normal']):\n",
+    "            y = racket_dats[change][strategy]\n",
+    "            colors = strategy_colors[strategy]\n",
+    "            bp = plt.boxplot(y.transpose(), patch_artist=True, positions = np.arange(y.shape[0])*4+i)\n",
+    "            setBoxColors(bp, colors)\n",
+    "    #        line, = plt.plot([1,1],c[0]+'-')\n",
+    "            invisibles.append(mpatches.Patch(color=colors[box_facecolor], label=strategy_to_titel(strategy)))\n",
+    "        axes = plt.gca()\n",
+    "        y_len = y.shape[0]\n",
+    "        axes.set_ylim([0,50])\n",
+    "        plt.ylabel('seconds')\n",
+    "        plt.xlabel('step')\n",
+    "        if change == 'mixed':\n",
+    "            axes.set_xlim([-1,y_len*4+1])\n",
+    "            axes.set_xticklabels(range(0,111,10))\n",
+    "            axes.set_xticks(range(1,y_len*4+41,40))\n",
+    "        else:\n",
+    "            axes.set_xlim([-1,y_len*4-1])\n",
+    "            axes.set_xticklabels(range(1,y_len+1))\n",
+    "            axes.set_xticks(range(1,y_len*4,4))\n",
     "\n",
-    "    plt.legend(handles=invisibles, loc='best')\n",
+    "        plt.legend(handles=invisibles, loc='best' if change == 'mixed' else 'upper center', ncol = 3, mode = \"expand\")\n",
     "\n",
-    "    plt.savefig('pngs/gen_bp_{0}_{1}.png'.format(name,change))\n",
-    "    plt.savefig('doc/gen_bp_{0}_{1}.pdf'.format(name,change))\n",
-    "    plt.close()"
+    "        fname = 'gen_bp_{0}{1}_{2}'.format(name,'_avg' if draw_average else '',change)\n",
+    "        plt.savefig(pdfpath(fname))\n",
+    "        plt.savefig(pngpath(fname))\n",
+    "        plt.close()\n",
+    "    print ''"
    ]
   },
   {
@@ -885,7 +955,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 32,
+   "execution_count": 26,
    "metadata": {
     "collapsed": false
    },
@@ -905,8 +975,9 @@
     "#        plt.title('{0} {1}'.format(name.title(), change_to_title(change)))\n",
     "        plt.ylabel('seconds')\n",
     "        plt.xlabel('step')\n",
-    "        plt.savefig('pngs/sol_bp_{0}_{1}.png'.format(name,change))\n",
-    "        plt.savefig('doc/sol_bp_{0}_{1}.pdf'.format(name,change))\n",
+    "        fname = 'sol_bp_{0}_{1}'.format(name,change)\n",
+    "        plt.savefig(pdfpath(fname))\n",
+    "        plt.savefig(pngpath(fname))\n",
     "        plt.close()\n",
     "    print ''"
    ]
@@ -923,7 +994,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 33,
+   "execution_count": 27,
    "metadata": {
     "collapsed": true
    },
@@ -959,7 +1030,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 34,
+   "execution_count": 28,
    "metadata": {
     "collapsed": false,
     "scrolled": true
@@ -978,7 +1049,7 @@
        "dtype([('dir', '<f8'), ('normalBaseline', '<f8'), ('flushedBaseline', '<f8'), ('noncachedBaseline', '<f8'), ('ratioNormalToFlushed', '<f8'), ('ratioNormalToNoncached', '<f8'), ('ratioFlushedToNoncached', '<f8'), ('speedupNormalToFlushed', '<f8'), ('speedupNormalToNoncached', '<f8'), ('speedupFlushedToNoncached', '<f8')])"
       ]
      },
-     "execution_count": 34,
+     "execution_count": 28,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -998,7 +1069,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 35,
+   "execution_count": 29,
    "metadata": {
     "collapsed": false,
     "scrolled": false
@@ -1015,9 +1086,10 @@
     "plt.legend(loc = 'best')\n",
     "plt.ylabel('% computed')\n",
     "#plt.suptitle('Cache Miss-Rate', fontsize = 16)\n",
-    "plt.savefig('doc/att_miss.pdf')\n",
-    "!pdfcrop doc/att_miss.pdf doc/att_miss_cropped.pdf > /dev/null\n",
-    "plt.savefig('pngs/att_miss.png')\n",
+    "fname = 'att_miss'\n",
+    "plt.savefig(pdfpath(fname))\n",
+    "plt.savefig(pngpath(fname))\n",
+    "#!pdfcrop doc/att_miss.pdf doc/att_miss_cropped.pdf > /dev/null\n",
     "plt.close()"
    ]
   },
@@ -1032,7 +1104,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 36,
+   "execution_count": 30,
    "metadata": {
     "collapsed": false
    },
@@ -1049,9 +1121,9 @@
     "plt.legend(loc = 'best')\n",
     "plt.ylabel('%')\n",
     "#plt.suptitle('Attribute Ratios', fontsize = 16)\n",
-    "plt.savefig('doc/att_r.pdf')\n",
-    "!pdfcrop doc/att_r.pdf doc/att_r_cropped.pdf > /dev/null\n",
-    "plt.savefig('pngs/att_r.png')\n",
+    "plt.savefig(pdfpath('att_r'))\n",
+    "plt.savefig(pngpath('att_r'))\n",
+    "#!pdfcrop doc/att_r.pdf doc/att_r_cropped.pdf > /dev/null\n",
     "plt.close()"
    ]
   },
@@ -1066,7 +1138,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 37,
+   "execution_count": 31,
    "metadata": {
     "collapsed": false,
     "scrolled": true
@@ -1084,9 +1156,9 @@
     "plt.legend(loc = 'best')\n",
     "plt.ylabel('%')\n",
     "plt.suptitle('Attribute Speed-Ups', fontsize = 16)\n",
-    "plt.savefig('doc/att_sp.pdf')\n",
-    "!pdfcrop doc/att_sp.pdf doc/att_sp_cropped.pdf > /dev/null\n",
-    "plt.savefig('pngs/att_sp.png')\n",
+    "plt.savefig(pdfpath('att_sp'))\n",
+    "plt.savefig(pngpath('att_sp'))\n",
+    "#!pdfcrop doc/att_sp.pdf doc/att_sp_cropped.pdf > /dev/null\n",
     "plt.close()"
    ]
   },
@@ -1099,7 +1171,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 38,
+   "execution_count": 32,
    "metadata": {
     "collapsed": false,
     "scrolled": false
@@ -1123,7 +1195,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 39,
+   "execution_count": 33,
    "metadata": {
     "collapsed": true
    },
@@ -1134,7 +1206,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 40,
+   "execution_count": 34,
    "metadata": {
     "collapsed": false
    },
@@ -1173,9 +1245,9 @@
     "#        plt.axes().xaxis.set_minor_formatter(matplotlib.ticker.FormatStrFormatter(\"%s\"))\n",
     "#        plt.axes().tick_params(which='major', pad=20, axis='x')\n",
     "        plt.subplots_adjust(top=0.85)\n",
-    "        plt.savefig('doc/{}.pdf'.format(fname_part))\n",
-    "        !pdfcrop {'doc/{}.pdf'.format(fname_part)} {'doc/{}_cropped.pdf'.format(fname_part)} > /dev/null\n",
-    "        plt.savefig('pngs/{}.png'.format(fname_part))\n",
+    "        plt.savefig(pdfpath(fname_part))\n",
+    "        plt.savefig(pngpath(fname_part))\n",
+    "#        !pdfcrop {'doc/{}.pdf'.format(fname_part)} {'doc/{}_cropped.pdf'.format(fname_part)} > /dev/null\n",
     "    except Exception as e:\n",
     "        print 'Error while drawing att in {0}: {1}'.format(change, e)\n",
     "        traceback.print_exc(file=sys.stdout)\n",
@@ -1185,7 +1257,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 41,
+   "execution_count": 35,
    "metadata": {
     "collapsed": false
    },
@@ -1222,7 +1294,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 42,
+   "execution_count": 36,
    "metadata": {
     "collapsed": true
    },
@@ -1244,9 +1316,9 @@
     "                ax.set_yscale('log')\n",
     "        plt.legend(loc='best')\n",
     "        fname_part = '{0}_{1}{2}'.format(kind,nr,'_log' if log else '')\n",
-    "        plt.savefig('doc/{}.pdf'.format(fname_part))\n",
-    "        !pdfcrop {'doc/{}.pdf'.format(fname_part)} {'doc/{}_cropped.pdf'.format(fname_part)} > /dev/null\n",
-    "        plt.savefig('pngs/{}.png'.format(fname_part))\n",
+    "        plt.savefig(pdfpath(fname_part))\n",
+    "        plt.savefig(pngpath(fname_part))\n",
+    "#        !pdfcrop {'doc/{}.pdf'.format(fname_part)} {'doc/{}_cropped.pdf'.format(fname_part)} > /dev/null\n",
     "    except Exception as e:\n",
     "        print 'Error while drawing att graph for {0}: {1}'.format(kind, e)\n",
     "        traceback.print_exc(file=sys.stdout)\n",
@@ -1256,7 +1328,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 43,
+   "execution_count": 37,
    "metadata": {
     "collapsed": false
    },
@@ -1275,7 +1347,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 138,
+   "execution_count": 38,
    "metadata": {
     "collapsed": false
    },
@@ -1308,9 +1380,9 @@
     "        plt.xlabel('Time (Seconds)')\n",
     "#        plt.legend(loc='best')\n",
     "        fname_part = 'memory_{0}-{1}'.format(kind,nr)\n",
-    "        plt.savefig('doc/{}.pdf'.format(fname_part))\n",
-    "        !pdfcrop {'doc/{}.pdf'.format(fname_part)} {'doc/{}_cropped.pdf'.format(fname_part)} > /dev/null\n",
-    "        plt.savefig('pngs/{}.png'.format(fname_part))\n",
+    "        plt.savefig(pdfpath(fname_part))\n",
+    "        plt.savefig(pngpath(fname_part))\n",
+    "#        !pdfcrop {'doc/{}.pdf'.format(fname_part)} {'doc/{}_cropped.pdf'.format(fname_part)} > /dev/null\n",
     "    except Exception as e:\n",
     "        print 'Error while drawing memory graph for {0}: {1}'.format(kind, e)\n",
     "        traceback.print_exc(file=sys.stdout)\n",
@@ -1320,7 +1392,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 139,
+   "execution_count": 39,
    "metadata": {
     "collapsed": false,
     "scrolled": true
diff --git a/ilp_measurement.py b/ilp_measurement.py
index de3a147190dd0a08564d6235228285e404e83ab1..ac996ad2ea05e95ee4d7b042d0b4155d1a4c70be 100644
--- a/ilp_measurement.py
+++ b/ilp_measurement.py
@@ -578,7 +578,7 @@ def avg(column, *files):
         with open(f) as fd:
             r = csv.reader(fd)
             values = [float(row[int(column)]) for row in r if not row[0].isalpha()]
-            return sum(values) / float(len(values))
+            return sum(values) * 1.0 / len(values)
     print { f : get_average_value(f) for f in files }
 
 @task(name = 'agt')
@@ -617,6 +617,27 @@ def att_graph_totals():
                 for step in sorted(steps):
                     csv.writer(fd).writerow([step]+list(steps[step]))
 
+@task
+def sums(f, namecol = 1, stepcol = 2, valuecol = 3, start = '00'):
+    """ Sums up one column blockwise, where start is the prefix of the name column and marks the begin of a block """
+    total, length, last_name = 0.0, 0, '?'
+    total_total, total_length = 0.0, 0
+    with open(f) as fd:
+        r = csv.reader(fd)
+        next(r)
+        for row in r:
+            if row[stepcol].startswith(start):
+                last_name = row[namecol]
+                if length > 0:
+                    print('{0:15}: {1:3}, Sum: {2:8.3f}, Average: {3:.3f}'.format(last_name, length, total, total*1.0/length))
+                total_total  += total
+                total_length += length
+                total, length = 0.0, 0
+            else:
+                total  += float(row[valuecol])
+                length += 1
+    print('Total elements: {0:3}, total sum: {1:3.3f}, total average: {2:.3f}'.format(total_length, total_total, total_total*1.0/total_length))
+
 
 if __name__ == '__main__':
     check()