{
  "cells": [
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "collapsed": false
      },
      "outputs": [],
      "source": [
        "%matplotlib inline"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "\n# Plotting Results\n\nCode example to plot the results after the experiment.\n\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "collapsed": false
      },
      "outputs": [],
      "source": [
        "try: import cPickle as pickle\nexcept: import pickle\n\nimport matplotlib\nimport matplotlib.pyplot as plt\nimport itertools\nfrom matplotlib import rc\nimport numpy as np\nimport pandas as pd\nimport seaborn\n\nfont = {'family': 'serif', 'serif': ['computer modern roman']}\nrc('text', usetex=False)\nrc('font', weight='bold')\nrc('font', size=8)\nrc('lines', markersize=2.5)\nrc('lines', linewidth=0.5)\nrc('xtick', labelsize=6)\nrc('ytick', labelsize=6)\nrc('axes', labelsize='small')\nrc('axes', labelweight='bold')\nrc('axes', titlesize='small')\nrc('axes', linewidth=1)\nplt.rc('font', **font)\nseaborn.set_style(\"darkgrid\")\nimport pdb\n\n\ndef plot_benchmark(domains, graph_attrs, attr_defaults, methods, graph_names, s_sch='rw'):\n    df_all = pd.DataFrame()\n    for d, m , g in itertools.product(*[domains, methods, graph_names]):\n        try:\n            df = pd.read_hdf(path+\n                \"%s_%s_%s_lp_%s_data_hyp.h5\" % (d, g, m, s_sch),\n                \"df\"\n            )\n        except:\n            print('%s_%s_%s_lp_%s_data_hyp.h5 not found. Ignoring data set' % (d, g, m, s_sch))\n            continue\n        df[\"Domain\"], df[\"Method\"], df[\"Graph\"] = d, m, g\n        df_all = df_all.append(df).reset_index()\n        df_all = df_all.drop(['index'], axis=1)\n    if df_all.empty:\n        return\n    df_all = df_all.drop(['dia'], axis=1)\n    plot_shape = (len(domains), len(graph_attrs))\n    fin1, axarray1 = plt.subplots(len(domains), len(graph_attrs), figsize=(7, 4), sharex='col', sharey='row')\n    data_idx = 0\n    gfs_score = {}\n    for dom in domains:\n        gfs_score[dom] = {m: 0 for m in methods}\n        n_attr = 0\n        for attr in graph_attrs:\n            plot_idx = np.unravel_index(data_idx, plot_shape)\n            data_idx += 1\n            try:\n                rem_attrs = list(set(graph_attrs) - {attr})\n                df_grouped = df_all[df_all[\"Domain\"]==dom]\n                for rem_attr in rem_attrs:\n                    df_grouped = df_grouped[df_grouped[rem_attr]==attr_defaults[rem_attr]]\n                df_grouped = df_grouped[[attr, \"Round Id\", \"LP MAP\", \"Method\", \"Graph\"]]\n                print(df_grouped.head())\n                df_grouped['LP MAP'] = df_grouped['LP MAP'].astype('float')\n                df_grouped = df_grouped.groupby([attr, \"Round Id\", \"Method\", \"Graph\"]).mean().reset_index()\n            except TypeError:\n                df_trun[hyp_key_ren + \"2\"] = \\\n                    df_trun[hyp_key_ren].apply(lambda x: str(x))\n                df_trun[hyp_key_ren] = df_trun[hyp_key_ren + \"2\"].copy()\n                df_trun = df_trun.drop([hyp_key_ren + \"2\"], axis=1)\n                df_grouped = df_trun.groupby([hyp_key_ren, \"Round Id\", \"Data\"]).max().reset_index()  \n\n            df_grouped['unit']=df_grouped.apply(lambda x:'%s_%s' % (x['Round Id'],x['Graph']),axis=1)\n            df_grouped = df_grouped.drop(['Round Id', \"Graph\"], axis=1)\n            m_scores = dict(df_grouped.groupby([\"Method\"])[\"LP MAP\"].mean())\n            n_attr += 1\n            gfs_score[dom] = {m: m_scores[m] + gfs_score[dom][m] for m in methods}\n            ax = seaborn.tsplot(time=attr, value=\"LP MAP\",\n                                    unit=\"unit\", condition=\"Method\", legend=False,\n                                    data=df_grouped, ax=axarray1[plot_idx[0], plot_idx[1]])\n            if not plot_idx[1]:\n                ax.set_ylabel(dom)\n            if plot_idx[1]:\n                ax.set_ylabel('')\n            if plot_idx[0] < len(domains) - 1:\n                ax.set_xlabel('')\n            attr_values = df_grouped[attr].unique()\n            l_diff = attr_values[-1] - attr_values[-2]\n            f_diff = attr_values[1] - attr_values[0]\n            l_f_diff_r = l_diff / f_diff\n            if l_f_diff_r > 1:\n                log_base = pow(l_f_diff_r, 1.0 / (len(attr_values) - 2))\n                ax.set_xscale('log', basex=round(log_base))\n            marker = [\"o\", \"s\", \"D\", \"^\", \"v\", \"8\", \"*\", \"p\", \"1\", \"h\"]\n            for line_i in range(len(ax.lines)):\n                ax.lines[line_i].set_marker(marker[line_i])\n        gfs_score[dom] = {m: gfs_score[dom][m]/n_attr for m in methods}\n    print(gfs_score)\n    plt.savefig(\n       'benchmark.pdf', \n       dpi=300, format='pdf', bbox_inches='tight'\n    )\n    plt.show()\n\ndef plot_benchmark_individual(domains, graph_attrs, attr_defaults, methods, graph_names, graph_short, s_sch='rw'):\n    df_all = pd.DataFrame()\n    for d, m , g in itertools.product(*[domains, methods, graph_names]):\n        try:\n            df = pd.read_hdf(path+\n                \"%s_%s_%s_lp_%s_data_hyp.h5\" % (d, g, m, s_sch),\n                \"df\"\n            )\n        except:\n            print('%s_%s_%s_lp_%s_data_hyp.h5 not found. Ignoring data set' % (d, g, m, s_sch))\n            continue\n        df[\"Method\"], df[\"Graph\"] = m, g\n        df_all = df_all.append(df).reset_index()\n        df_all = df_all.drop(['index'], axis=1)\n    if df_all.empty:\n        return\n    df_all = df_all.drop(['dia'], axis=1)\n    plot_shape = (len(graph_names), len(graph_attrs))\n    fin1, axarray1 = plt.subplots(len(graph_names), len(graph_attrs), figsize=(7, 4), sharex='col', sharey='row')\n    data_idx = 0\n    for graph in graph_names:\n        for attr in graph_attrs:\n            plot_idx = np.unravel_index(data_idx, plot_shape)\n            data_idx += 1\n            try:\n                rem_attrs = list(set(graph_attrs) - {attr})\n                df_grouped = df_all[df_all[\"Graph\"]==graph]\n                for rem_attr in rem_attrs:\n                    df_grouped = df_grouped[df_grouped[rem_attr]==attr_defaults[rem_attr]]\n                df_grouped = df_grouped[[attr, \"Round Id\", \"LP MAP\", \"Method\"]]\n                print(df_grouped.head())\n                df_grouped['LP MAP'] = df_grouped['LP MAP'].astype('float')\n                df_grouped = df_grouped.groupby([attr, \"Round Id\", \"Method\"]).mean().reset_index()\n            except TypeError:\n                df_trun[hyp_key_ren + \"2\"] = \\\n                    df_trun[hyp_key_ren].apply(lambda x: str(x))\n                df_trun[hyp_key_ren] = df_trun[hyp_key_ren + \"2\"].copy()\n                df_trun = df_trun.drop([hyp_key_ren + \"2\"], axis=1)\n                df_grouped = df_trun.groupby([hyp_key_ren, \"Round Id\", \"Data\"]).max().reset_index()  \n\n            if data_idx == len(graph_names) * len(graph_attrs):\n                legend = True\n            else:\n                legend = False\n            ax = seaborn.tsplot(time=attr, value=\"LP MAP\",\n                                    unit=\"Round Id\", condition=\"Method\", legend=legend,\n                                    data=df_grouped, ax=axarray1[plot_idx[0], plot_idx[1]])\n            if legend:\n                ax.legend_.remove()\n            if not plot_idx[1]:\n                ax.set_ylabel(graph_short[graph])\n            if plot_idx[1]:\n                ax.set_ylabel('')\n            if plot_idx[0] < len(graph_names) - 1:\n                ax.set_xlabel('')\n            attr_values = df_grouped[attr].unique()\n            l_diff = attr_values[-1] - attr_values[-2]\n            f_diff = attr_values[1] - attr_values[0]\n            l_f_diff_r = l_diff / f_diff\n            if l_f_diff_r > 1:\n                log_base = pow(l_f_diff_r, 1.0 / (len(attr_values) - 2))\n                ax.set_xscale('log', basex=round(log_base))\n            marker = [\"o\", \"s\", \"D\", \"^\", \"v\", \"8\", \"*\", \"p\", \"1\", \"h\"]\n            for line_i in range(len(ax.lines)):\n                ax.lines[line_i].set_marker(marker[line_i])\n    for col_idx in range(axarray1[3].shape[0]):\n        box = axarray1[3][col_idx].get_position()\n        axarray1[3][col_idx].set_position(\n            [box.x0,\n             box.y0 + box.height * 0.1,\n             box.width,\n             box.height * 0.9]\n        )\n    fin1.legend(loc='lower center', bbox_to_anchor=(0.45, -0.01),\n                ncol=len(methods), fancybox=True, shadow=True)\n    fin1.savefig(\n       'benchmark_individual3.pdf', \n       dpi=300, format='pdf', bbox_inches='tight'\n    )\n    plt.show()\n\n\n#Path for the stored .h5 result \npath = '/Users/Bench_files/new_files/'\n\n\n\nplot_benchmark(\n    [\"social\", \"biology\", \"internet\"],\n    [\"N\", \"dim\", \"deg\"],\n    {\"N\": 4096, \"deg\": 8, \"dia\": None, \"dim\": 128},\n    [\"gf\", \"rand\", \"pa\", \"lap\", \"hope\", \"cn\", \"aa\",\"sdne\"],\n    [\"watts_strogatz_graph\", \"barabasi_albert_graph\", \"powerlaw_cluster_graph\", \"random_geometric_graph\",\\\n     \"duplication_divergence_graph\",\"hyperbolic_graph\",\"r_mat_graph\",\"waxman_graph\",\"stochastic_block_model\",\\\n     \"stochastic_kronecker_graph\"],\n    s_sch='rw'\n)\n\nplot_benchmark_individual(\n    [\"social\", \"biology\", \"internet\"],\n    [\"N\", \"dim\", \"deg\"],\n    {\"N\": 4096, \"deg\": 8, \"dia\": None, \"dim\": 128},\n    [\"gf\", \"rand\", \"pa\", \"lap\", \"hope\", \"cn\", \"aa\", \"sdne\"],\n    [\"watts_strogatz_graph\", \"barabasi_albert_graph\", \"powerlaw_cluster_graph\", \"random_geometric_graph\",\\\n     \"duplication_divergence_graph\",\"hyperbolic_graph\",\"r_mat_graph\",\"waxman_graph\",\"stochastic_kronecker_graph\"],\n    {\"watts_strogatz_graph\": \"WS\", \"barabasi_albert_graph\": \"BA\", \\\n     \"powerlaw_cluster_graph\": \"PC\", \"random_geometric_graph\": \"RG\",\\\n     \"duplication_divergence_graph\": \"DD\", \"hyperbolic_graph\": \"HB\",\\\n     \"r_mat_graph\": \"RM\", \"waxman_graph\":\"WM\",\"stochastic_block_model\":\"SBM\", \"stochastic_kronecker_graph\": \"KG\"\n    },\n    s_sch='rw'\n)"
      ]
    }
  ],
  "metadata": {
    "kernelspec": {
      "display_name": "Python 3",
      "language": "python",
      "name": "python3"
    },
    "language_info": {
      "codemirror_mode": {
        "name": "ipython",
        "version": 3
      },
      "file_extension": ".py",
      "mimetype": "text/x-python",
      "name": "python",
      "nbconvert_exporter": "python",
      "pygments_lexer": "ipython3",
      "version": "3.6.8"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 0
}