{
  "cells": [
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "collapsed": false
      },
      "outputs": [],
      "source": [
        "%matplotlib inline"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "\n# Experiment with Benchmark\n\nExample to run the benchmark across all the baseline embedding algorithms.\n\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "collapsed": false
      },
      "outputs": [],
      "source": [
        "from subprocess import call\nimport itertools\ntry: import cPickle as pickle\nexcept: import pickle\nimport json\nfrom argparse import ArgumentParser\nimport networkx as nx\nimport pandas as pd\nimport pdb\nimport os\nimport sys\nfrom time import time\n# sys.path.insert(0, './')\nfrom gemben.utils import graph_gens\n\nmethClassMap = {\"gf\": \"GraphFactorization\",\n                \"hope\": \"HOPE\",\n                \"lap\": \"LaplacianEigenmaps\",\n                \"node2vec\": \"node2vec\",\n                \"sdne\": \"SDNE\",\n                \"pa\": \"PreferentialAttachment\",\n                \"rand\": \"RandomEmb\",\n                \"cn\": \"CommonNeighbors\",\n                \"aa\": \"AdamicAdar\",\n                \"jc\": \"JaccardCoefficient\"}\n\nif __name__ == \"__main__\":\n    ''' Sample usage\n    python experiments/exp_synthetic.py -syn_names all -plot_hyp_data 1 -meths all\n    '''\n    t1 = time()\n    parser = ArgumentParser(description='Graph Embedding Benchmark Experiments')\n    parser.add_argument('-data', '--data_sets',\n                        help='dataset names (default: barabasi_albert_graph)')\n    parser.add_argument('-dims', '--dimensions',\n                        help='embedding dimensions list(default: 128)')\n    parser.add_argument('-meth', '--methods',\n                        help='method list (default: all methods)')\n    parser.add_argument('-plot_hyp_data', '--plot_hyp_data',\n                        help='plot the hyperparameter results (default: False)')\n    parser.add_argument('-rounds', '--rounds',\n                        help='number of rounds (default: 20)')\n    parser.add_argument('-s_sch', '--samp_scheme',\n                        help='sampling scheme (default: rw)')\n    parser.add_argument('-lexp', '--lexp',\n                        help='load experiment (default: False)')\n    params = json.load(\n        open('gemben/experiments/config/params_benchmark.conf', 'r')\n    )\n    args = vars(parser.parse_args())\n    print (args)\n    syn_hyps = json.load(\n        open('gemben/experiments/config/syn_hypRange.conf', 'r')\n    )\n    for k, v in args.items():\n        if v is not None:\n            params[k] = v\n    params[\"rounds\"] = int(params[\"rounds\"])\n    if params[\"data_sets\"] == \"all\":\n        params[\"data_sets\"] = syn_hyps.keys()\n    else:\n        params[\"data_sets\"] = params[\"data_sets\"].split(',')\n    params[\"lexp\"] = bool(int(params[\"lexp\"]))\n    params[\"plot_hyp_data\"] = bool(int(params[\"plot_hyp_data\"]))\n    if params[\"methods\"] == \"all\":\n        params[\"methods\"] = methClassMap.keys()\n    else:\n        params[\"methods\"] = params[\"methods\"].split(',')\n    params[\"dimensions\"] = params[\"dimensions\"].split(',')\n    samp_scheme = params[\"samp_scheme\"]\n    for syn_data in params[\"data_sets\"]:\n        syn_hyp_range = syn_hyps[syn_data]\n        hyp_keys = list(syn_hyp_range.keys())\n        if syn_data == \"binary_community_graph\":\n            graphClass = getattr(graph_gens, syn_data)\n        else:\n            graphClass = getattr(nx, syn_data)\n        ev_cols = [\"GR MAP\", \"LP MAP\", \"LP P@100\", \"NC F1 score\"]\n        for dim in params[\"dimensions\"]:\n            dim = int(dim)\n            for meth in params[\"methods\"]:\n                if not params[\"lexp\"]:\n                    hyp_df = pd.DataFrame(\n                        columns=hyp_keys + ev_cols + [\"Round Id\"]\n                    )\n                    hyp_r_idx = 0\n                    for hyp in itertools.product(*syn_hyp_range.values()):\n                        hyp_dict = dict(zip(hyp_keys, hyp))\n                        hyp_str = '_'.join(\n                            \"%s=%r\" % (key, val) for (key, val) in hyp_dict.items()\n                        )\n                        syn_data_folder = 'benchmark_%s_%s' % (syn_data, hyp_str)\n                        hyp_df_row = dict(zip(hyp_keys, hyp))\n                        for r_id in range(params[\"rounds\"]):\n                            G = graphClass(**hyp_dict)\n                            if not os.path.exists(\"gemben/data/%s\" % syn_data_folder):\n                                os.makedirs(\"gemben/data/%s\" % syn_data_folder)\n                            nx.write_gpickle(\n                                G, 'gemben/data/%s/graph.gpickle' % syn_data_folder\n                            )\n                            os.system(\n                                \"python gem/experiments/exp.py -data %s -meth %s -dim %d -rounds 1 -s_sch %s -exp lp\" % (syn_data_folder, meth, dim, samp_scheme)\n                            )\n                            MAP, prec, n_samps = pickle.load(\n                                open('gemben/results/%s_%s_%d_%s.lp' % (syn_data_folder, meth, dim, samp_scheme), 'rb')\n                            )        \n                            hyp_df.loc[hyp_r_idx, hyp_keys] = \\\n                                pd.Series(hyp_df_row)\n                            prec_100 = prec[int(n_samps[0])][0][100]\n                            hyp_df.loc[hyp_r_idx, ev_cols + [\"Round Id\"]] = \\\n                                [0, MAP[int(n_samps[0])][0], prec_100, 0, r_id]\n                            hyp_r_idx += 1\n                    hyp_df.to_hdf(\n                        \"gemben/intermediate/%s_%s_lp_%s_dim_%d_data_hyp.h5\" % (syn_data, meth, samp_scheme, dim),\n                        \"df\"\n                    )\n            if params[\"plot_hyp_data\"]:\n                from gem.utils import plot_util\n                plot_util.plot_hyp_data2(\n                    hyp_keys, [\"lp\"], params[\"methods\"], syn_data, samp_scheme, dim\n                )\n    print('Total time taken: %f sec' % (time() - t1))"
      ]
    }
  ],
  "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
}