{
  "cells": [
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "collapsed": false
      },
      "outputs": [],
      "source": [
        "%matplotlib inline"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "\n# Module to run a single or multiple examples\n\nModule 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\nimport networkx as nx\nimport pandas as pd\nimport pdb\nimport os\nimport sys\nfrom time import time\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\nclass exp:\n    def __init__(self, domain=\"social\", method=\"sdne\", rounds=1,lexp=False, samp_scheme='rw', plot_hyp_data=False):\n        \n        t1 = time()\n        self.params = json.load(\n            open('gemben/experiments/config/params_benchmark.conf', 'r')\n        )\n        self.domain_graph_map = json.load(\n            open('gemben/experiments/config/domain_graph_map.conf', 'r')\n        )\n        # graph_hyp_range: {N: [128, 256, 512, 1024], deg: [4, 6,8, 10, 12]}\n        self.graph_hyp_range = json.load(\n            open('gemben/experiments/config/graph_hyp_range.conf', 'r')\n        )\n        # def_graph_hyps: {N: 1024, deg: 8, dia: None, dim: 128}\n        self.def_graph_hyps = json.load(\n            open('gemben/experiments/config/def_graph_hyps.conf', 'r')\n        )\n\n        self.params[\"rounds\"] = rounds\n        self.params[\"graphs\"] = self.domain_graph_map[domain]\n        self.params[\"lexp\"] = lexp\n        self.params[\"plot_hyp_data\"] = plot_hyp_data\n        if method == \"all\":\n            self.params[\"methods\"] = methClassMap.keys()\n        elif len(method)>1:\n            self.params[\"methods\"] = method.split(',')\n        else:\n            self.params[\"methods\"] = self.method\n        self.samp_scheme = samp_scheme\n\n\n    def run(self):    \n\n        try:\n          os.makedirs(\"gemben/intermediate\")\n        except:\n          pass\n        try:\n          os.makedirs(\"gemben/results\")\n        except:\n          pass\n        try:\n          os.makedirs(\"gemben/temp\")\n        except:\n          pass\n\n        graph_hyp_keys = list(self.graph_hyp_range.keys())\n        ev_cols = [\"LP MAP\", \"LP P@100\"]\n        for meth , graph in itertools.product(*[self.params[\"methods\"],self.params[\"graphs\"]]):\n            hyp_df = pd.DataFrame(\n                    columns=graph_hyp_keys + ev_cols + [\"Round Id\"]\n                )\n            hyp_r_idx = 0\n            for hyp_key in graph_hyp_keys:\n               \n                for curr_hyp_key_range, r_id in itertools.product(\n                    *[graph_hyp_range[hyp_key], range(self.params[\"rounds\"])]\n                ):\n                    \n                    if r_id == 0: \n                        f_hyp = 1\n                    else:\n                        f_hyp = 0\n                    \n                    curr_hyps = self.def_graph_hyps.copy()\n                \n                    curr_hyps[hyp_key] = curr_hyp_key_range\n                    curr_hyps[\"domain\"] = self.params[\"domain_name\"]\n                    hyp_str = '_'.join(\n                                \"%s=%s\" % (key, str(val).strip(\"'\")) for (key, val) in curr_hyps.items()\n                            )\n                    \n                    hyp_str_graph_name = '_'.join(\n                                \"%s=%s\" % (key, str(val).strip(\"'\")) for (key, val) in curr_hyps.items() if key != 'dim' \n                            )\n                    \n                    syn_data_folder = 'benchmark_%s_%s_%s' % (graph, hyp_str_graph_name, r_id)\n                    \n                    graphClass = getattr(graph_gens, graph)\n                    \n                    try:\n                        nx.read_gpickle(\n                                'gemben/data/%s/graph.gpickle' % syn_data_folder\n                      )\n                    except:\n                        flag =  1\n                        ##### flag = 0 means the labels are continous on lcc\n                        while flag:\n                            print(\"Graph is generating...\")\n                            G = graphClass(**curr_hyps)[0]\n                            if len(set(G.nodes())) == G.number_of_nodes() and list(G.nodes())[-1] == G.number_of_nodes() -1:\n                                flag = 0\n                        if G:\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                    perf_exp = not self.params[\"lexp\"]      \n                    if self.params[\"lexp\"]:\n                      try:\n                        MAP, prec, n_samps = pickle.load(\n                          open('gemben/results/%s_%s_%d_%s.lp' % (\n                              syn_data_folder, meth, \n                              curr_hyps[\"dim\"], self.samp_scheme), 'rb'))\n                      except:   \n                          perf_exp = 1\n                           ##### only find the best hyp for first round\n                    if perf_exp:\n                        os.system(\n                          \"python3 gemben/experiments/exp.py -data %s -meth %s -dim %d -rounds 1 -find_hyp %d -s_sch %s -exp lp\" % (\n                              syn_data_folder,\n                              meth,\n                              curr_hyps[\"dim\"],\n                              f_hyp,\n                              self.samp_scheme\n                          )\n                        )\n                    MAP, prec, n_samps = pickle.load(\n                    open('gemben/results/%s_%s_%d_%s.lp' % (\n                        syn_data_folder, meth, \n                        curr_hyps[\"dim\"], self.samp_scheme), 'rb'))        \n                    hyp_df.loc[hyp_r_idx, graph_hyp_keys] = \\\n                    pd.Series(curr_hyps)\n                    #prec_100 = prec[int(n_samps[0])][0][100]\n                    try:\n                      prec_100 = list(prec.values())[0][0][100]\n                    except:\n                      pdb.set_trace()\n                    f_temp = open(\"gemben/temp/%s_%s_%s_lp_%s_data_hyp.txt\" % (\n                      self.params[\"domain_name\"], graph, meth, self.samp_scheme), 'a')\n                    f_temp.write('%s: round: %d, MAP: %f, prec_100: %f' % (hyp_str, r_id, list(MAP.values())[0][0], prec_100))\n                    f_temp.close()\n                    hyp_df.loc[hyp_r_idx, ev_cols + [\"Round Id\"]] = \\\n                    [list(MAP.values())[0][0], prec_100, r_id]\n                    #[MAP[int(n_samps[0])][0], prec_100, r_id]\n                    hyp_r_idx += 1\n\n            hyp_df.to_hdf(\n                \"gemben/intermediate/%s_%s_%s_lp_%s_data_hyp.h5\" % (\n                    self.params[\"domain_name\"], graph, meth, self.samp_scheme),\n                \"df\"\n            )\n            print('Experiments done for %s, %s' % (graph, meth))"
      ]
    }
  ],
  "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
}