{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "--- This is a regression problem ---\n", "\n", "1. Loading dataset from file...\n", "\n", "2. Calculating gram matrices. This could take a while...\n", "\n", " --- treelet kernel matrix of size 183 built in 0.4853649139404297 seconds ---\n", "\n", "gram matrix with parameters {} is: \n", "[[4.00000000e+00 2.60653066e+00 1.00000000e+00 ... 1.26641655e-14\n", " 1.26641655e-14 1.26641655e-14]\n", " [2.60653066e+00 6.00000000e+00 1.00000000e+00 ... 1.26641655e-14\n", " 1.26641655e-14 1.26641655e-14]\n", " [1.00000000e+00 1.00000000e+00 4.00000000e+00 ... 3.00000000e+00\n", " 3.00000000e+00 3.00000000e+00]\n", " ...\n", " [1.26641655e-14 1.26641655e-14 3.00000000e+00 ... 1.80000000e+01\n", " 1.30548713e+01 8.19020657e+00]\n", " [1.26641655e-14 1.26641655e-14 3.00000000e+00 ... 1.30548713e+01\n", " 2.20000000e+01 9.71901120e+00]\n", " [1.26641655e-14 1.26641655e-14 3.00000000e+00 ... 8.19020657e+00\n", " 9.71901120e+00 1.60000000e+01]]\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "3. Fitting and predicting using nested cross validation. This could really take a while...\n", "calculate performance: 0%| | 1/630 [00:00<01:18, 8.01it/s]" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/home/ljia/.local/lib/python3.5/site-packages/sklearn/linear_model/ridge.py:154: UserWarning: Singular matrix in solving dual problem. Using least-squares solution instead.\n", " warnings.warn(\"Singular matrix in solving dual problem. Using \"\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " \n", "4. Getting final performances...\n", "\n", "best_params_out: [{}]\n", "best_params_in: [{'alpha': 1.584893192461114}]\n", "best_val_perf: 14.214089277459907\n", "best_val_std: 0.7950978152856186\n", "final_performance: 15.264883647635374\n", "final_confidence: 3.652980498319737\n", "train_performance: 7.3835358737013825\n", "train_std: 0.37481098899403587\n", "time to calculate gram matrix: 0.4853649139404297 s\n", "\n", "params train_perf valid_perf test_perf gram_matrix_time\n", "--------------------- ------------ ------------- ------------- ------------------\n", "{'alpha': '1.00e-01'} 29.66±26.12 114.74±104.67 120.03±92.58 0.49\n", "{'alpha': '1.26e-01'} 51.13±89.42 171.35±229.94 168.66±208.15 0.49\n", "{'alpha': '1.58e-01'} 60.74±185.03 167.81±433.71 285.25±995.56 0.49\n", "{'alpha': '2.00e-01'} 26.25±24.38 80.66±63.18 98.06±123.24 0.49\n", "{'alpha': '2.51e-01'} 16.22±10.15 59.60±58.66 61.21±57.88 0.49\n", "{'alpha': '3.16e-01'} 15.24±16.69 53.27±75.97 53.33±66.20 0.49\n", "{'alpha': '3.98e-01'} 13.22±14.43 41.69±47.57 36.61±32.28 0.49\n", "{'alpha': '5.01e-01'} 11.73±14.79 31.17±39.05 30.08±34.14 0.49\n", "{'alpha': '6.31e-01'} 7.58±1.79 18.06±3.34 19.22±6.57 0.49\n", "{'alpha': '7.94e-01'} 7.02±0.75 15.87±1.77 16.82±4.71 0.49\n", "{'alpha': '1.00e+00'} 6.96±0.53 14.87±1.27 15.83±4.10 0.49\n", "{'alpha': '1.26e+00'} 7.10±0.42 14.38±0.98 15.38±3.78 0.49\n", "{'alpha': '1.58e+00'} 7.38±0.37 14.21±0.80 15.26±3.65 0.49\n", "{'alpha': '2.00e+00'} 7.78±0.36 14.27±0.68 15.37±3.64 0.49\n", "{'alpha': '2.51e+00'} 8.28±0.35 14.50±0.59 15.63±3.71 0.49\n", "{'alpha': '3.16e+00'} 8.89±0.35 14.88±0.53 16.01±3.85 0.49\n", "{'alpha': '3.98e+00'} 9.60±0.35 15.39±0.49 16.50±4.03 0.49\n", "{'alpha': '5.01e+00'} 10.42±0.35 16.03±0.46 17.11±4.25 0.49\n", "{'alpha': '6.31e+00'} 11.37±0.34 16.80±0.45 17.83±4.50 0.49\n", "{'alpha': '7.94e+00'} 12.47±0.34 17.72±0.46 18.68±4.76 0.49\n", "{'alpha': '1.00e+01'} 13.74±0.33 18.79±0.47 19.69±5.04 0.49\n", "calculate performance: 100%|██████████| 630/630 [01:10<00:00, 11.78it/s]" ] } ], "source": [ "%load_ext line_profiler\n", "%matplotlib inline\n", "import numpy as np\n", "import sys\n", "sys.path.insert(0, \"../\")\n", "from pygraph.utils.model_selection_precomputed import model_selection_for_precomputed_kernel\n", "from pygraph.kernels.treeletKernel import treeletkernel\n", "\n", "datafile = '../../../../datasets/acyclic/Acyclic/dataset_bps.ds'\n", "estimator = treeletkernel\n", "param_grid_precomputed = {}\n", "param_grid = {'alpha': np.logspace(-1, 1, num = 21, base = 10)}\n", "\n", "model_selection_for_precomputed_kernel(datafile, estimator, param_grid_precomputed, param_grid, \n", " 'regression', NUM_TRIALS=30)" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", " --- This is a regression problem ---\n", "\n", "\n", " Loading dataset from file...\n", "\n", " Calculating kernel matrix, this could take a while...\n", "\n", " --- treelet kernel matrix of size 185 built in 0.47543811798095703 seconds ---\n", "[[4.00000000e+00 2.60653066e+00 1.00000000e+00 ... 1.26641655e-14\n", " 1.26641655e-14 1.26641655e-14]\n", " [2.60653066e+00 6.00000000e+00 1.00000000e+00 ... 1.26641655e-14\n", " 1.26641655e-14 1.26641655e-14]\n", " [1.00000000e+00 1.00000000e+00 4.00000000e+00 ... 3.00000000e+00\n", " 3.00000000e+00 3.00000000e+00]\n", " ...\n", " [1.26641655e-14 1.26641655e-14 3.00000000e+00 ... 1.80000000e+01\n", " 1.30548713e+01 8.19020657e+00]\n", " [1.26641655e-14 1.26641655e-14 3.00000000e+00 ... 1.30548713e+01\n", " 2.20000000e+01 9.71901120e+00]\n", " [1.26641655e-14 1.26641655e-14 3.00000000e+00 ... 8.19020657e+00\n", " 9.71901120e+00 1.60000000e+01]]\n", "\n", " Starting calculate accuracy/rmse...\n", "calculate performance: 98%|█████████▊| 983/1000 [00:01<00:00, 796.45it/s]\n", " Mean performance on train set: 2.688029\n", "With standard deviation: 1.541623\n", "\n", " Mean performance on test set: 10.099738\n", "With standard deviation: 5.035844\n", "calculate performance: 100%|██████████| 1000/1000 [00:01<00:00, 745.11it/s]\n", "\n", "\n", " rmse_test std_test rmse_train std_train k_time\n", "----------- ---------- ------------ ----------- --------\n", " 10.0997 5.03584 2.68803 1.54162 0.475438\n" ] } ], "source": [ "%load_ext line_profiler\n", "\n", "import sys\n", "sys.path.insert(0, \"../\")\n", "from pygraph.utils.utils import kernel_train_test\n", "from pygraph.kernels.treeletKernel import treeletkernel\n", "\n", "datafile = '../../../../datasets/acyclic/Acyclic/dataset_bps.ds'\n", "kernel_file_path = 'kernelmatrices_path_acyclic/'\n", "\n", "kernel_para = dict(node_label = 'atom', edge_label = 'bond_type', labeled = True)\n", "\n", "kernel_train_test(datafile, kernel_file_path, treeletkernel, kernel_para, normalize = False)\n", "\n", "# %lprun -f treeletkernel \\\n", "# kernel_train_test(datafile, kernel_file_path, treeletkernel, kernel_para, normalize = False)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# results\n", "\n", "# with y normalization\n", " RMSE_test std_test RMSE_train std_train k_time\n", "----------- ---------- ------------ ----------- --------\n", " 8.3079 3.37838 2.90887 1.2679 0.500302\n", "\n", "# without y normalization\n", " RMSE_test std_test RMSE_train std_train k_time\n", "----------- ---------- ------------ ----------- --------\n", " 10.0997 5.03584 2.68803 1.54162 0.484171\n", "\n", " \n", "\n", "# G0 -> WL subtree h = 0\n", " rmse_test std_test rmse_train std_train k_time\n", "----------- ---------- ------------ ----------- --------\n", " 13.9223 2.88611 13.373 0.653301 0.186731\n", "\n", "# G0 U G1 U G6 U G8 U G13 -> WL subtree h = 1\n", " rmse_test std_test rmse_train std_train k_time\n", "----------- ---------- ------------ ----------- --------\n", " 8.97706 2.90771 6.7343 1.17505 0.223171\n", " \n", "# all patterns \\ { G3 U G4 U G5 U G10 } -> WL subtree h = 2 \n", " rmse_test std_test rmse_train std_train k_time\n", "----------- ---------- ------------ ----------- --------\n", " 7.31274 1.96289 3.73909 0.406267 0.294902\n", "\n", "# all patterns \\ { G4 U G5 } -> WL subtree h = 3\n", " rmse_test std_test rmse_train std_train k_time\n", "----------- ---------- ------------ ----------- --------\n", " 8.39977 2.78309 3.8606 1.58686 0.348912\n", "\n", "# all patterns \\ { G5 } \n", " rmse_test std_test rmse_train std_train k_time\n", "----------- ---------- ------------ ----------- --------\n", " 9.47647 4.22113 3.18029 1.5669 0.423638\n", " \n", " \n", " \n", "# G0, -> WL subtree h = 0\n", " rmse_test std_test rmse_train std_train k_time\n", "----------- ---------- ------------ ----------- --------\n", " 13.9223 2.88611 13.373 0.653301 0.186731 \n", " \n", "# G0 U G1 U G2 U G6 U G8 U G13 -> WL subtree h = 1\n", " rmse_test std_test rmse_train std_train k_time\n", "----------- ---------- ------------ ----------- --------\n", " 8.62431 2.54327 5.63422 0.255002 0.290797\n", " \n", "# all patterns \\ { G5 U G10 } -> WL subtree h = 2\n", " rmse_test std_test rmse_train std_train k_time\n", "----------- ---------- ------------ ----------- --------\n", " 10.1294 3.50275 3.69664 1.55116 0.418498" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{0: 'C', 1: 'C', 2: 'C', 3: 'C', 4: 'C', 5: 'O', 6: 'O'}\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "{0: 'C', 1: 'C', 2: 'C', 3: 'C', 4: 'C', 5: 'C', 6: 'O', 7: 'O'}\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "\n", " pattern 0: [0, 1, 2, 3, 4, 5, 6, 7]\n", " treelet 0: ['C', 'C', 'C', 'C', 'C', 'C', 'O', 'O']\n", "\n", " pattern 1 : [[4, 0], [4, 1], [5, 4], [6, 2], [6, 5], [7, 3], [7, 5]]\n", " treelet 1 : ['1C1C', '1C1C', '1C1C', '1C1O', '1C1O', '1C1O', '1C1O']\n", "\n", " pattern 2 : [[1, 4, 0], [5, 4, 0], [5, 4, 1], [5, 6, 2], [5, 7, 3], [6, 5, 4], [7, 5, 4], [7, 5, 6]]\n", " treelet 2 : ['2C1C1C', '2C1C1C', '2C1C1C', '2C1O1C', '2C1O1C', '2C1C1O', '2C1C1O', '2O1C1O']\n", "\n", " pattern 3 : [[4, 5, 6, 2], [4, 5, 7, 3], [6, 5, 4, 0], [6, 5, 4, 1], [6, 5, 7, 3], [7, 5, 4, 0], [7, 5, 4, 1], [7, 5, 6, 2]]\n", " treelet 3 : ['3C1C1O1C', '3C1C1O1C', '3C1C1C1O', '3C1C1C1O', '3C1O1C1O', '3C1C1C1O', '3C1C1C1O', '3C1O1C1O']\n", "\n", " pattern 4 : [[2, 6, 5, 4, 0], [2, 6, 5, 4, 1], [3, 7, 5, 4, 0], [3, 7, 5, 4, 1], [3, 7, 5, 6, 2]]\n", " treelet 4 : ['4C1C1C1O1C', '4C1C1C1O1C', '4C1C1C1O1C', '4C1C1C1O1C', '4C1O1C1O1C']\n", "\n", " pattern 5 : []\n", " treelet 5 : []\n", "\n", " pattern 3 star: [[4, 0, 1, 5], [5, 4, 6, 7]]\n", " treelet 3 star: ['6CC1C1C1', '6CC1O1O1']\n", "\n", " pattern 4 star: []\n", " treelet 4 star: []\n", "\n", " pattern 5 star: []\n", " treelet 5 star: []\n", "\n", " pattern 7: [[4, 0, 1, 5, 6], [4, 0, 1, 5, 7], [5, 7, 6, 4, 0], [5, 7, 6, 4, 1], [5, 4, 7, 6, 2], [5, 4, 6, 7, 3]]\n", " treelet 7: ['7CC1C1C1O1', '7CC1C1C1O1', '7CO1O1C1C1', '7CO1O1C1C1', '7CC1O1O1C1', '7CC1O1O1C1']\n", "\n", " pattern 11: []\n", " treelet 11: []\n", "\n", " pattern 10: [[4, 0, 1, 5, 6, 2], [4, 0, 1, 5, 7, 3]]\n", " treelet 10: ['aCO1C1C1C1C1', 'aCO1C1C1C1C1']\n", "\n", " pattern 12: [[4, 0, 1, 5, 7, 6]]\n", " treelet 12: ['cCC1C1C1O1O1']\n", "\n", " pattern 9: [[5, 7, 6, 4, 2, 0], [5, 7, 6, 4, 2, 1], [5, 6, 7, 4, 3, 0], [5, 6, 7, 4, 3, 1], [5, 4, 7, 6, 3, 2]]\n", " treelet 9: ['9CO1C1O1C1C1', '9CO1C1O1C1C1', '9CO1C1O1C1C1', '9CO1C1O1C1C1', '9CC1O1O1C1C1']\n", "\n", " numbers of canonical keys: {'2O1C1O': 1, '7CC1C1C1O1': 2, '7CC1O1O1C1': 2, 'aCO1C1C1C1C1': 2, '2C1C1C': 3, '6CC1C1C1': 1, '9CO1C1O1C1C1': 4, '1C1C': 3, '3C1C1C1O': 4, '4C1C1C1O1C': 4, '7CO1O1C1C1': 2, '2C1C1O': 2, '1C1O': 4, '9CC1O1O1C1C1': 1, '3C1C1O1C': 2, '6CC1O1O1': 1, '2C1O1C': 2, '0O': 2, '4C1O1C1O1C': 1, 'cCC1C1C1O1O1': 1, '0C': 6, '3C1O1C1O': 2}\n", "\n", " pattern 0: [0, 1, 2, 3, 4, 5, 6]\n", " treelet 0: ['C', 'C', 'C', 'C', 'C', 'O', 'O']\n", "\n", " pattern 1 : [[2, 0], [3, 1], [5, 2], [5, 4], [6, 3], [6, 4]]\n", " treelet 1 : ['1C1C', '1C1C', '1C1O', '1C1O', '1C1O', '1C1O']\n", "\n", " pattern 2 : [[4, 5, 2], [4, 6, 3], [5, 2, 0], [6, 3, 1], [6, 4, 5]]\n", " treelet 2 : ['2C1O1C', '2C1O1C', '2C1C1O', '2C1C1O', '2O1C1O']\n", "\n", " pattern 3 : [[4, 5, 2, 0], [4, 6, 3, 1], [5, 4, 6, 3], [6, 4, 5, 2]]\n", " treelet 3 : ['3C1C1O1C', '3C1C1O1C', '3C1O1C1O', '3C1O1C1O']\n", "\n", " pattern 4 : [[3, 6, 4, 5, 2], [5, 4, 6, 3, 1], [6, 4, 5, 2, 0]]\n", " treelet 4 : ['4C1O1C1O1C', '4C1C1O1C1O', '4C1C1O1C1O']\n", "\n", " pattern 5 : [[2, 5, 4, 6, 3, 1], [3, 6, 4, 5, 2, 0]]\n", " treelet 5 : ['5C1C1O1C1O1C', '5C1C1O1C1O1C']\n", "\n", " pattern 3 star: []\n", " treelet 3 star: []\n", "\n", " pattern 4 star: []\n", " treelet 4 star: []\n", "\n", " pattern 5 star: []\n", " treelet 5 star: []\n", "\n", " pattern 7: []\n", " treelet 7: []\n", "\n", " pattern 11: []\n", " treelet 11: []\n", "\n", " pattern 10: []\n", " treelet 10: []\n", "\n", " pattern 12: []\n", " treelet 12: []\n", "\n", " pattern 9: []\n", " treelet 9: []\n", "\n", " numbers of canonical keys: {'3C1C1O1C': 2, '2O1C1O': 1, '1C1O': 4, '2C1O1C': 2, '0O': 2, '5C1C1O1C1O1C': 2, '1C1C': 2, '4C1O1C1O1C': 1, '0C': 5, '3C1O1C1O': 2, '4C1C1O1C1O': 2, '2C1C1O': 2}\n" ] } ], "source": [ "import sys\n", "import pathlib\n", "from collections import Counter\n", "from itertools import chain\n", "sys.path.insert(0, \"../\")\n", "\n", "import networkx as nx\n", "import numpy as np\n", "import time\n", "\n", "from sklearn.metrics.pairwise import rbf_kernel, paired_distances\n", "import matplotlib.pyplot as plt\n", "\n", "# main\n", "import sys\n", "from collections import Counter\n", "import networkx as nx\n", "sys.path.insert(0, \"../\")\n", "from pygraph.utils.graphfiles import loadDataset\n", "\n", "\n", "def main(): \n", " dataset, y = loadDataset(\"../../../../datasets/acyclic/Acyclic/dataset_bps.ds\")\n", " G1 = dataset[15]\n", " print(nx.get_node_attributes(G1, 'label'))\n", " nx.draw_networkx(G1)\n", " plt.show()\n", " G2 = dataset[57] # 180 double 4, 57, 3, double 3\n", " print(nx.get_node_attributes(G2, 'label'))\n", " nx.draw_networkx(G2)\n", " plt.show()\n", "\n", " treeletkernel(G1, G2, labeled = True)\n", " # Kmatrix = weisfeilerlehmankernel(G1, G2)\n", " \n", "def find_paths(G, source_node, length):\n", " if length == 0:\n", " return [[source_node]]\n", " path = [ [source_node] + path for neighbor in G[source_node] \\\n", " for path in find_paths(G, neighbor, length - 1) if source_node not in path ]\n", " return path\n", "\n", "def find_all_paths(G, length):\n", " all_paths = []\n", " for node in G:\n", " all_paths.extend(find_paths(G, node, length))\n", " all_paths_r = [ path[::-1] for path in all_paths ]\n", " \n", " # remove double direction\n", " for idx, path in enumerate(all_paths[:-1]):\n", " for path2 in all_paths_r[idx+1::]:\n", " if path == path2:\n", " all_paths[idx] = []\n", " break\n", " \n", " return list(filter(lambda a: a != [], all_paths))\n", "\n", "def get_canonkey(G, node_label = 'atom', edge_label = 'bond_type', labeled = True):\n", " \n", " patterns = {}\n", " canonkey = {} # canonical key\n", " \n", " ### structural analysis ###\n", " # linear patterns\n", " patterns['0'] = G.nodes()\n", " canonkey['0'] = nx.number_of_nodes(G)\n", " for i in range(1, 6):\n", " patterns[str(i)] = find_all_paths(G, i)\n", " canonkey[str(i)] = len(patterns[str(i)])\n", " \n", " # n-star patterns\n", " patterns['3star'] = [ [node] + [neighbor for neighbor in G[node]] for node in G.nodes() if G.degree(node) == 3 ]\n", " patterns['4star'] = [ [node] + [neighbor for neighbor in G[node]] for node in G.nodes() if G.degree(node) == 4 ]\n", " patterns['5star'] = [ [node] + [neighbor for neighbor in G[node]] for node in G.nodes() if G.degree(node) == 5 ] \n", " # n-star patterns\n", " canonkey['6'] = len(patterns['3star'])\n", " canonkey['8'] = len(patterns['4star'])\n", " canonkey['d'] = len(patterns['5star'])\n", " \n", " # pattern 7\n", " patterns['7'] = []\n", " for pattern in patterns['3star']:\n", " for i in range(1, len(pattern)):\n", " if G.degree(pattern[i]) >= 2:\n", " pattern_t = pattern[:]\n", " pattern_t[i], pattern_t[3] = pattern_t[3], pattern_t[i]\n", " for neighborx in G[pattern[i]]:\n", " if neighborx != pattern[0]:\n", " new_pattern = pattern_t + [ neighborx ]\n", "# new_patterns = [ pattern + [neighbor] for neighbor in G[pattern[i]] if neighbor != pattern[0] ]\n", " patterns['7'].append(new_pattern)\n", " canonkey['7'] = len(patterns['7'])\n", " \n", " # pattern 11\n", " patterns['11'] = []\n", " for pattern in patterns['4star']:\n", " for i in range(1, len(pattern)):\n", " if G.degree(pattern[i]) >= 2:\n", " pattern_t = pattern[:]\n", " pattern_t[i], pattern_t[4] = pattern_t[4], pattern_t[i]\n", " for neighborx in G[pattern[i]]:\n", " if neighborx != pattern[0]:\n", " new_pattern = pattern_t + [ neighborx ]\n", "# new_patterns = [ pattern + [neighborx] for neighborx in G[pattern[i]] if neighborx != pattern[0] ]\n", " patterns['11'].append(new_pattern)\n", " canonkey['b'] = len(patterns['11'])\n", " \n", " # pattern 12\n", " patterns['12'] = []\n", " rootlist = []\n", " for pattern in patterns['3star']:\n", "# print(pattern)\n", " if pattern[0] not in rootlist:\n", " rootlist.append(pattern[0])\n", " for i in range(1, len(pattern)):\n", " if G.degree(pattern[i]) >= 3:\n", " rootlist.append(pattern[i])\n", " pattern_t = pattern[:]\n", " pattern_t[i], pattern_t[3] = pattern_t[3], pattern_t[i]\n", " for neighborx1 in G[pattern[i]]:\n", " if neighborx1 != pattern[0]:\n", " for neighborx2 in G[pattern[i]]:\n", " if neighborx1 > neighborx2 and neighborx2 != pattern[0]:\n", " new_pattern = pattern_t + [neighborx1] + [neighborx2]\n", "# new_patterns = [ pattern + [neighborx1] + [neighborx2] for neighborx1 in G[pattern[i]] if neighborx1 != pattern[0] for neighborx2 in G[pattern[i]] if (neighborx1 > neighborx2 and neighborx2 != pattern[0]) ]\n", " patterns['12'].append(new_pattern)\n", " canonkey['c'] = int(len(patterns['12']) / 2)\n", " \n", " # pattern 9\n", " patterns['9'] = []\n", " for pattern in patterns['3star']:\n", "# print('pattern: ', pattern)\n", " for pairs in [ [neighbor1, neighbor2] for neighbor1 in G[pattern[0]] if G.degree(neighbor1) >= 2 \\\n", " for neighbor2 in G[pattern[0]] if G.degree(neighbor2) >= 2 if neighbor1 > neighbor2 ]:\n", "# print('pairs: ', pairs)\n", " pattern_t = pattern[:]\n", "# print('pattern_t: ', pattern_t)\n", " pattern_t[pattern_t.index(pairs[0])], pattern_t[2] = pattern_t[2], pattern_t[pattern_t.index(pairs[0])]\n", "# print('pattern_t: ', pattern_t)\n", " pattern_t[pattern_t.index(pairs[1])], pattern_t[3] = pattern_t[3], pattern_t[pattern_t.index(pairs[1])]\n", "# print('pattern_t: ', pattern_t)\n", " for neighborx1 in G[pairs[0]]:\n", " if neighborx1 != pattern[0]:\n", " for neighborx2 in G[pairs[1]]:\n", " if neighborx2 != pattern[0]:\n", " new_pattern = pattern_t + [neighborx1] + [neighborx2]\n", "# new_patterns = [ pattern + [neighborx1] + [neighborx2] for neighborx1 in G[pairs[0]] if neighborx1 != pattern[0] for neighborx2 in G[pairs[1]] if neighborx2 != pattern[0] ]\n", " patterns['9'].append(new_pattern)\n", " canonkey['9'] = len(patterns['9'])\n", " \n", " # pattern 10\n", " patterns['10'] = []\n", " for pattern in patterns['3star']: \n", " for i in range(1, len(pattern)):\n", " if G.degree(pattern[i]) >= 2:\n", " for neighborx in G[pattern[i]]:\n", " if neighborx != pattern[0] and G.degree(neighborx) >= 2:\n", " pattern_t = pattern[:]\n", " pattern_t[i], pattern_t[3] = pattern_t[3], pattern_t[i]\n", " new_patterns = [ pattern_t + [neighborx] + [neighborxx] for neighborxx in G[neighborx] if neighborxx != pattern[i] ]\n", " patterns['10'].extend(new_patterns)\n", " canonkey['a'] = len(patterns['10'])\n", " \n", " ### labeling information ###\n", " if labeled == True:\n", " canonkey_l = {}\n", " \n", " # linear patterns\n", " canonkey_t = Counter(list(nx.get_node_attributes(G, node_label).values()))\n", " for key in canonkey_t:\n", " canonkey_l['0' + key] = canonkey_t[key]\n", " print('\\n pattern 0: ', patterns['0'])\n", " print(' treelet 0: ', list(nx.get_node_attributes(G, node_label).values()))\n", " \n", " for i in range(1, 6):\n", " treelet = []\n", " for pattern in patterns[str(i)]:\n", " canonlist = list(chain.from_iterable((G.node[node][node_label], \\\n", " G[node][pattern[idx+1]][edge_label]) for idx, node in enumerate(pattern[:-1])))\n", " canonlist.append(G.node[pattern[-1]][node_label])\n", " canonkey_t = ''.join(canonlist)\n", " canonkey_t = canonkey_t if canonkey_t < canonkey_t[::-1] else canonkey_t[::-1]\n", " treelet.append(str(i) + canonkey_t)\n", " canonkey_l.update(Counter(treelet))\n", " print('\\n pattern', i, ': ', patterns[str(i)])\n", " print(' treelet', i, ': ', treelet)\n", " \n", "# print(canonkey_l)\n", " \n", " # n-star patterns\n", " for i in range(3, 6):\n", " treelet = []\n", " for pattern in patterns[str(i) + 'star']:\n", " canonlist = [ G.node[leaf][node_label] + G[leaf][pattern[0]][edge_label] for leaf in pattern[1:] ]\n", " canonlist.sort()\n", " canonkey_t = ('d' if i == 5 else str(i * 2)) + G.node[pattern[0]][node_label] + ''.join(canonlist)\n", " treelet.append(canonkey_t)\n", " canonkey_l.update(Counter(treelet))\n", " print('\\n pattern', i, 'star: ', patterns[str(i) + 'star'])\n", " print(' treelet', i, 'star: ', treelet)\n", " \n", " # pattern 7\n", " treelet = []\n", " for pattern in patterns['7']:\n", " canonlist = [ G.node[leaf][node_label] + G[leaf][pattern[0]][edge_label] for leaf in pattern[1:3] ]\n", " canonlist.sort()\n", " canonkey_t = '7' + G.node[pattern[0]][node_label] + ''.join(canonlist) \\\n", " + G.node[pattern[3]][node_label] + G[pattern[3]][pattern[0]][edge_label] \\\n", " + G.node[pattern[4]][node_label] + G[pattern[4]][pattern[3]][edge_label]\n", " treelet.append(canonkey_t)\n", " canonkey_l.update(Counter(treelet))\n", " print('\\n pattern 7: ', patterns['7'])\n", " print(' treelet 7: ', treelet)\n", " \n", " # pattern 11\n", " treelet = []\n", " for pattern in patterns['11']:\n", " canonlist = [ G.node[leaf][node_label] + G[leaf][pattern[0]][edge_label] for leaf in pattern[1:4] ]\n", " canonlist.sort()\n", " canonkey_t = 'b' + G.node[pattern[0]][node_label] + ''.join(canonlist) \\\n", " + G.node[pattern[4]][node_label] + G[pattern[4]][pattern[0]][edge_label] \\\n", " + G.node[pattern[5]][node_label] + G[pattern[5]][pattern[4]][edge_label]\n", " treelet.append(canonkey_t)\n", " canonkey_l.update(Counter(treelet))\n", " print('\\n pattern 11: ', patterns['11'])\n", " print(' treelet 11: ', treelet)\n", "\n", " # pattern 10\n", " treelet = []\n", " for pattern in patterns['10']:\n", " canonkey4 = G.node[pattern[5]][node_label] + G[pattern[5]][pattern[4]][edge_label]\n", " canonlist = [ G.node[leaf][node_label] + G[leaf][pattern[0]][edge_label] for leaf in pattern[1:3] ]\n", " canonlist.sort()\n", " canonkey0 = ''.join(canonlist)\n", " canonkey_t = 'a' + G.node[pattern[3]][node_label] \\\n", " + G.node[pattern[4]][node_label] + G[pattern[4]][pattern[3]][edge_label] \\\n", " + G.node[pattern[0]][node_label] + G[pattern[0]][pattern[3]][edge_label] \\\n", " + canonkey4 + canonkey0\n", "# canonkey_t = 'a' + G.node[pattern[0]][node_label] + ''.join(canonlist) \\\n", "# + G.node[pattern[3]][node_label] + G[pattern[3]][pattern[0]][edge_label] \\\n", "# + G.node[pattern[4]][node_label] + G[pattern[4]][pattern[3]][edge_label]\n", " treelet.append(canonkey_t)\n", " canonkey_l.update(Counter(treelet))\n", " print('\\n pattern 10: ', patterns['10'])\n", " print(' treelet 10: ', treelet)\n", " \n", " # pattern 12\n", " treelet = []\n", " for pattern in patterns['12']:\n", " canonlist0 = [ G.node[leaf][node_label] + G[leaf][pattern[0]][edge_label] for leaf in pattern[1:3] ]\n", " canonlist0.sort()\n", " canonlist3 = [ G.node[leaf][node_label] + G[leaf][pattern[3]][edge_label] for leaf in pattern[4:6] ]\n", " canonlist3.sort()\n", " canonkey_t1 = 'c' + G.node[pattern[0]][node_label] \\\n", " + ''.join(canonlist0) \\\n", " + G.node[pattern[3]][node_label] + G[pattern[3]][pattern[0]][edge_label] \\\n", " + ''.join(canonlist3)\n", " \n", " canonkey_t2 = 'c' + G.node[pattern[3]][node_label] \\\n", " + ''.join(canonlist3) \\\n", " + G.node[pattern[0]][node_label] + G[pattern[0]][pattern[3]][edge_label] \\\n", " + ''.join(canonlist0)\n", " \n", " treelet.append(canonkey_t1 if canonkey_t1 < canonkey_t2 else canonkey_t2)\n", " canonkey_l.update(Counter(treelet))\n", " print('\\n pattern 12: ', patterns['12'])\n", " print(' treelet 12: ', treelet)\n", " \n", " # pattern 9\n", " treelet = []\n", " for pattern in patterns['9']:\n", " canonkey2 = G.node[pattern[4]][node_label] + G[pattern[4]][pattern[2]][edge_label]\n", " canonkey3 = G.node[pattern[5]][node_label] + G[pattern[5]][pattern[3]][edge_label]\n", " prekey2 = G.node[pattern[2]][node_label] + G[pattern[2]][pattern[0]][edge_label]\n", " prekey3 = G.node[pattern[3]][node_label] + G[pattern[3]][pattern[0]][edge_label]\n", " if prekey2 + canonkey2 < prekey3 + canonkey3:\n", " canonkey_t = G.node[pattern[1]][node_label] + G[pattern[1]][pattern[0]][edge_label] \\\n", " + prekey2 + prekey3 + canonkey2 + canonkey3\n", " else:\n", " canonkey_t = G.node[pattern[1]][node_label] + G[pattern[1]][pattern[0]][edge_label] \\\n", " + prekey3 + prekey2 + canonkey3 + canonkey2\n", " treelet.append('9' + G.node[pattern[0]][node_label] + canonkey_t)\n", " canonkey_l.update(Counter(treelet))\n", " print('\\n pattern 9: ', patterns['9'])\n", " print(' treelet 9: ', treelet)\n", " \n", "\n", " \n", " \n", " print('\\n numbers of canonical keys: ', canonkey_l)\n", " \n", " \n", " return canonkey_l\n", " \n", " return canonkey\n", " \n", "\n", "def treeletkernel(*args, node_label = 'atom', edge_label = 'bond_type', labeled = True):\n", " if len(args) == 1: # for a list of graphs\n", " Gn = args[0]\n", " Kmatrix = np.zeros((len(Gn), len(Gn)))\n", "\n", " start_time = time.time()\n", " \n", " for i in range(0, len(Gn)):\n", " print(i)\n", " for j in range(i, len(Gn)):\n", " Kmatrix[i][j] = treeletkernel(Gn[i], Gn[j], labeled = labeled, node_label = node_label, edge_label = edge_label)\n", " Kmatrix[j][i] = Kmatrix[i][j]\n", "\n", " run_time = time.time() - start_time\n", " print(\"\\n --- treelet kernel matrix of size %d built in %s seconds ---\" % (len(Gn), run_time))\n", " \n", " return Kmatrix, run_time\n", " \n", " else: # for only 2 graphs\n", " \n", " G1 = args[0]\n", " G = args[1]\n", " kernel = 0\n", " \n", "# start_time = time.time()\n", " \n", " \n", " canonkey2 = get_canonkey(G, node_label = node_label, edge_label = edge_label, labeled = labeled)\n", " canonkey1 = get_canonkey(G1, node_label = node_label, edge_label = edge_label, labeled = labeled)\n", " \n", " keys = set(canonkey1.keys()) & set(canonkey2.keys()) # find same canonical keys in both graphs\n", " vector1 = np.matrix([ (canonkey1[key] if (key in canonkey1.keys()) else 0) for key in keys ])\n", "# print(vector1)\n", " vector2 = np.matrix([ (canonkey2[key] if (key in canonkey2.keys()) else 0) for key in keys ]) \n", " kernel = np.sum(np.exp(- np.square(vector1 - vector2) / 2))\n", "# print(vector2)\n", " \n", " # labeling information\n", " \n", " # equal keys and graph isomorphism\n", " \n", "\n", "# run_time = time.time() - start_time\n", "# print(\"\\n --- treelet kernel built in %s seconds ---\" % (run_time))\n", " \n", "# print(kernel)\n", " return kernel#, run_time\n", " \n", "if __name__ == '__main__':\n", " main()" ] } ], "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 }