{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "import sys\n",
    "import pathlib\n",
    "sys.path.insert(0, \"../py-graph/\")\n",
    "\n",
    "\n",
    "import networkx as nx\n",
    "import numpy as np\n",
    "import time\n",
    "\n",
    "from utils.utils import getSPGraph\n",
    "\n",
    "\n",
    "def pathkernel(*args):\n",
    "    \"\"\"Calculate shortest-path kernels between graphs.\n",
    "    \n",
    "    Parameters\n",
    "    ----------\n",
    "    Gn : List of NetworkX graph\n",
    "        List of graphs between which the kernels are calculated.\n",
    "    /\n",
    "    G1, G2 : NetworkX graphs\n",
    "        2 graphs between which the kernel is calculated.\n",
    "        \n",
    "    Return\n",
    "    ------\n",
    "    Kmatrix/Kernel : Numpy matrix/int\n",
    "        Kernel matrix, each element of which is the sp kernel between 2 praphs. / SP Kernel between 2 graphs.\n",
    "        \n",
    "    References\n",
    "    ----------\n",
    "    [1] Borgwardt KM, Kriegel HP. Shortest-path kernels on graphs. InData Mining, Fifth IEEE International Conference on 2005 Nov 27 (pp. 8-pp). IEEE.\n",
    "    \"\"\"\n",
    "    if len(args) == 1: # for a list of graphs\n",
    "        Gn = args[0]\n",
    "        \n",
    "        Kmatrix = np.zeros((len(Gn), len(Gn)))\n",
    "    \n",
    "        Sn = [] # get shortest path graphs of Gn\n",
    "        for i in range(0, len(Gn)):\n",
    "            Sn.append(getSPGraph(Gn[i]))\n",
    "\n",
    "        start_time = time.time()\n",
    "        for i in range(0, len(Gn)):\n",
    "            for j in range(i, len(Gn)):\n",
    "                for e1 in Sn[i].edges(data = True):\n",
    "                    for e2 in Sn[j].edges(data = True):          \n",
    "                        if e1[2]['cost'] != 0 and e1[2]['cost'] == e2[2]['cost'] and ((e1[0] == e2[0] and e1[1] == e2[1]) or (e1[0] == e2[1] and e1[1] == e2[0])):\n",
    "                            Kmatrix[i][j] += 1\n",
    "                            Kmatrix[j][i] += (0 if i == j else 1)\n",
    "\n",
    "        print(\"--- shortest path kernel matrix of size %d built in %s seconds ---\" % (len(Gn), (time.time() - start_time)))\n",
    "        \n",
    "        return Kmatrix\n",
    "        \n",
    "    else: # for only 2 graphs\n",
    "        G1 = args[0]\n",
    "        G2 = args[1]\n",
    "        \n",
    "        kernel = 0\n",
    "        \n",
    "        for e1 in G1.edges(data = True):\n",
    "            for e2 in G2.edges(data = True):          \n",
    "                if e1[2]['cost'] != 0 and e1[2]['cost'] == e2[2]['cost'] and ((e1[0] == e2[0] and e1[1] == e2[1]) or (e1[0] == e2[1] and e1[1] == e2[0])):\n",
    "                    kernel += 1\n",
    "\n",
    "        print(\"--- shortest path kernel built in %s seconds ---\" % (time.time() - start_time))\n",
    "        \n",
    "        return kernel"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "--- shortest path kernel matrix of size 185 built in 34.96375751495361 seconds ---\n",
      "[[  3.   1.   3. ...,   1.   1.   1.]\n",
      " [  1.   6.   1. ...,   0.   0.   3.]\n",
      " [  3.   1.   3. ...,   1.   1.   1.]\n",
      " ..., \n",
      " [  1.   0.   1. ...,  55.  21.   7.]\n",
      " [  1.   0.   1. ...,  21.  55.   7.]\n",
      " [  1.   3.   1. ...,   7.   7.  55.]]\n"
     ]
    }
   ],
   "source": [
    "from utils.graphfiles import loadDataset\n",
    "\n",
    "dataset, y = loadDataset(\"/home/ljia/Documents/research-repo/datasets/acyclic/Acyclic/dataset_bps.ds\")\n",
    "G1 = dataset[12]\n",
    "G2 = dataset[20]\n",
    "Kmatrix = spkernel(dataset)\n",
    "\n",
    "print(Kmatrix)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "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.5.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
