{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Performance improvements for computationally expensive measures\n", "\n", "We can benchmark the performance of the local efficiency algorithm with the BCT implementation. Here, Comet offers a significant performance increase, especially for large networks.\n", "This speed-up will affect all measures that depend on path length calculations (global efficiency, local efficiency, shortest average path length).\n", "\n", "The following code block will run for 10-15 minutes, so it might be preferable to enjoy the figure instead of running it again :)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "image/png": "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N26cS+rN9vLLL5uePXvm+D4UZ735rfm6664zbdq0MevWrTN79uwxkyZNMm5ububPP/+0tymun+WFCxeaRYsWmb///tvs3LnTPPnkk8bT09Ns2bLFbN682dx0001m4cKFZvfu3WbZsmWmbt26pl+/fvbXF/f2vVTNxhjzyy+/mMDAQDN58mSzZcsWs2PHDjN37lyTmppqX0dx/63IVtj9RXFtZwWOInTkyBEDmFWrVhljbDsyT09P8/nnn9vbbN++3QBm7dq1l1zfqVOnTN26dc3SpUtNx44d7T9Al7teZ+jVq5e56667HObddNNNZuDAgcYYY6xWqwkPDzcvvviifXlCQoLx9vY2n376abHWmtvO+0K//fabAcy+ffuMMcZs27bNAOb333+3t1m8eLGxWCzm33//dWa5xpjca7711lvNHXfckedrXP1zUpjfh++++864ubmZuLg4e5sZM2aYwMBAk5aWVqz1ZtuwYYO54oorzOHDh3N8H1xZb141+/v7mw8++MChXUhIiHnnnXeMMa7/Wa5YsaJ59913c102b9484+XlZTIyMowxrt++2c6vOTo62jz11FN5tnXV9r2c/UVxbWedUilC2YcCQ0JCAFi/fj0ZGRl07drV3qZ+/fpUr16dtWvXXnJ9Dz74IL169XJ4fVGs1xnatm3LsmXL+PvvvwH466+/+Omnn+jZsycAsbGxxMXFOdQcFBREdHS0y2q+mMTERCwWC8HBwYDtEGpwcDCtW7e2t+natStubm6sW7eu2OuzWq0sWrSIK6+8ku7du1OlShWio6MdDve7+uekML8Pa9eupUmTJoSFhdnbdO/enaSkJLZu3Vqs9QKkpKRw++238+abbxIeHp7jNa6sN6+a27Zty9y5czlx4gRWq5XPPvuM1NRUOnXqZK/ZFT/LWVlZfPbZZ5w+fZqYmJg8P09gYCAeHh72Wl25fS+s+ciRI6xbt44qVarQtm1bwsLC6NixIz/99JP9Na7avpezvyiu7aybtxURq9XKqFGjuOaaa2jcuDFgO5fq5eVl32llCwsLIy4u7qLr++yzz/jzzz/5/fffcyy7nPU6y9ixY0lKSqJ+/fq4u7uTlZXF888/z8CBAwHsdZ3/A5393FU15yU1NZUxY8Zw22232W9uFBcXR5UqVRzaeXh4EBIS4pL6jxw5QnJyMlOmTOG5555j6tSp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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import bct\n", "import time\n", "import numpy as np\n", "from matplotlib import pyplot as plt\n", "from comet import graph\n", "\n", "# Random graph with 400 nodes and 50% density\n", "W = np.random.rand(400,400)\n", "W = graph.symmetrise(W)\n", "W = graph.threshold(W, type=\"density\", density=0.5)\n", "\n", "# Init methods at least once to avoid first-time overhead\n", "init_comet = graph.efficiency(W[:10,:10], local=True)\n", "init_bct = bct.efficiency_wei(W[:10,:10])\n", "\n", "# Run efficiency computation with increasing number of nodes\n", "eff_comet = []\n", "eff_bct = []\n", "nodes = [20,40,80,120,160,200,240,280,320,360,400] # this will probably take more than 10 minutes\n", "\n", "for i in nodes:\n", " start = time.time()\n", " eff = graph.efficiency(W[:i,:i], local=True)\n", " eff_comet.append(time.time() - start)\n", "\n", " start = time.time()\n", " eff = bct.efficiency_wei(W[:i,:i], local=True)\n", " eff_bct.append(time.time() - start)\n", "\n", "# Plot the results\n", "plt.figure(figsize=(6,4))\n", "plt.title('Nodal Efficiency Benchmark')\n", "plt.plot(nodes, eff_comet, label=\"comet\", marker='o')\n", "plt.plot(nodes, eff_bct, label=\"bct\", marker='o')\n", "plt.xlabel('Number of nodes')\n", "plt.xticks(nodes)\n", "plt.ylabel('Time (s)')\n", "plt.legend();" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Matching index calculations are also significantly faster:" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "image/png": "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dZ4/fy4GDx4sSpcuLezs7MS7774rIiMjjfZz69Yt0bFjR2FrayvKlCkjRo8eLVJSUgo19v79+wtfX19hZWUlXF1dRevWrQ2JginHnZnXkwVTjb9nz57C09NTWFlZibJly4qePXsajVNgqnGn2bp1q6hRo4awtrYWVatWFT/++KPRdlP9WxVCiJ07dwoA6eIRwrTPu0ajESNGjBA+Pj7CxsZGVKhQQXz99ddGt9+Z8nnfsGGDqFChgrCyshIeHh5iyJAhIjY21uRiL6rPofPnz4umTZsKa2trUbZsWTFz5sx8x84pqomIiChL7LNAREREWWKyQERERFliskBERERZYrJAREREWWKyQERERFliskBERERZYrJAREREWWKyQERERFliskBUAt26dQsKhQLnzp2TOxSDf/75B2+++SZsbGxQp06dIj325MmTi/yYROaEyQKRDPr16weFQoGZM2calW/ZsgUKhUKmqOQ1adIklCpVClevXjWaTIeI5MdkgUgmNjY2mDVrFp4+fSp3KAUmOTk5z8+9ceMGmjZtCl9fX7i4uBRgVESUX0wWiGTSpk0beHh4ICQkJNM6GTWPz5s3D+XLlzes9+vXD++88w5mzJgBd3d3ODk5YerUqUhNTcXYsWPh7OyMcuXKITQ0NN3+//nnHzRu3Bg2NjaoUaMGDhw4YLT90qVL6NixI+zt7eHu7o4+ffrg8ePHhu0tWrTA0KFDMXLkSJQpUwbt27fP8HXo9XpMnToV5cqVg7W1NerUqYPw8HDDdoVCgTNnzmDq1KlQKBSYPHlyhvtp0aIFhg8fji+//BLOzs7w8PBIV/fOnTvo2rUr7O3t4ejoiB49euDhw4dGdWbOnAl3d3c4ODhgwIABSEpKSnesFStWoFq1arCxsUHVqlWxZMkSw7bk5GQMHToUnp6esLGxga+vb5a/RyJzx2SBSCYqlQozZszAwoULce/evXzta+/evXjw4AEOHjyIOXPmYNKkSXj77bdRunRpnDhxAp999hk+/fTTdMcZO3YsRo8ejbNnzyIwMBCdO3fGkydPAACxsbFo1aoV6tati9OnTyM8PBwPHz5Ejx49jPaxatUqWFlZ4ciRI1i2bFmG8c2fPx///e9/8f333+PChQto3749unTpgmvXrgEAIiMjUb16dYwePRqRkZEYM2ZMpq911apVKFWqFE6cOIHZs2dj6tSp2L17NwApKenatStiYmJw4MAB7N69Gzdv3kTPnj0Nz9+4cSMmT56MGTNm4PTp0/D09DRKBABgzZo1+OabbzB9+nRcuXIFM2bMwMSJE7Fq1SoAwIIFCxAWFoaNGzfi6tWrWLNmjVECR1Ts5HveSiLKteDgYNG1a1chhBBvvvmm6N+/vxBCiM2bN4tX/ywnTZokateubfTcuXPnCl9fX6N9+fr6Cp1OZyirUqWKaNasmWE9NTVVlCpVSqxbt04IIURERIQAYDR1bUpKiihXrpyYNWuWEEKIadOmiXbt2hkd++7du0ZTMAcFBYm6detm+3q9vLzE9OnTjcoaNGggBg8ebFivXbu2mDRpUpb7CQoKEk2bNk23n3HjxgkhhNi1a5dQqVTizp07hu1///23ACBOnjwphBAiMDDQ6LhCCNGoUSOj81yxYkWxdu1aozrTpk0TgYGBQgghhg0bJlq1aiX0en2W8RIVF2xZIJLZrFmzsGrVKly5ciXP+6hevTqUypd/zu7u7qhZs6ZhXaVSwcXFBdHR0UbPCwwMNCxbWFggICDAEMf58+exb98+2NvbGx5Vq1YFIPUvSFO/fv0sY9NoNHjw4AGaNGliVN6kSZM8veZatWoZrXt6ehpe15UrV+Dt7Q1vb2/Ddn9/fzg5ORmOdeXKFTRq1MhoH6+eh2fPnuHGjRsYMGCA0Wv/9ttvDa+7X79+OHfuHKpUqYLhw4dj165duX4dRObEQu4AiEq65s2bo3379pgwYQL69etntE2pVEIIYVSWkpKSbh+WlpZG6wqFIsMyvV6f47gSEhLQuXNnzJo1K902T09Pw3KpUqVyvM+CkN/XlZ2EhAQAwPLly9MlFSqVCgBQr149REREYMeOHdizZw969OiBNm3a4Ndffy2wOIhMCVsWiEzAzJkzsXXrVhw7dsyo3NXVFVFRUUYJQ0GOjXD8+HHDcmpqKs6cOYNq1aoBkD4Q//77b5QvXx6VKlUyeuQmQXB0dISXlxeOHDliVH7kyBH4+/sXzAt5oVq1arh79y7u3r1rKLt8+TJiY2MNx6pWrRpOnDhh9LxXz4O7uzu8vLxw8+bNdK/bz8/P6HX17NkTy5cvx4YNG/C///0PMTExBfp6iEwFWxaITEDNmjXRu3dvLFiwwKi8RYsWePToEWbPno3u3bsjPDwcO3bsgKOjY4Ecd/HixahcuTKqVauGuXPn4unTp+jfvz8AYMiQIVi+fDl69epluPvg+vXrWL9+PVasWGH4lp0TY8eOxaRJk1CxYkXUqVMHoaGhOHfuHNasWVMgryNNmzZtDOdy3rx5SE1NxeDBgxEUFISAgAAAwIgRI9CvXz8EBASgSZMmWLNmDf7++29UqFDBsJ8pU6Zg+PDhUKvV6NChA7RaLU6fPo2nT59i1KhRmDNnDjw9PVG3bl0olUps2rQJHh4ecHJyKtDXQ2Qq2LJAZCKmTp2arjm9WrVqWLJkCRYvXozatWvj5MmTWd4pkFszZ87EzJkzUbt2bRw+fBhhYWEoU6YMABhaA3Q6Hdq1a4eaNWti5MiRcHJyMuofkRPDhw/HqFGjMHr0aNSsWRPh4eEICwtD5cqVC+y1ANIlid9//x2lS5dG8+bN0aZNG1SoUAEbNmww1OnZsycmTpyIL7/8EvXr18ft27fx+eefG+1n4MCBWLFiBUJDQ1GzZk0EBQVh5cqVhpYFBwcHzJ49GwEBAWjQoAFu3bqF7du35/q8EJkLhXj9gigRERHRK5gGExERUZaYLBAREVGWmCwQERFRlpgsEBERUZaYLBAREVGWmCwQERFRlpgsEBERUZaYLBAREVGWmCwQERFRlpgsEBERUZaYLBAREVGW/h8AkZT/6/RqvgAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Random graph with 400 nodes and 50% density\n", "W = np.random.rand(1000,1000)\n", "W = graph.symmetrise(W)\n", "W = graph.threshold(W, type=\"density\", density=0.5)\n", "\n", "# Init methods at least once to avoid first-time overhead\n", "init_comet = graph.matching_ind_und(W[:10,:10])\n", "init_bct = bct.matching_ind_und(W[:10,:10])\n", "\n", "# Run efficiency computation with increasing number of nodes\n", "eff_comet = []\n", "eff_bct = []\n", "nodes = [100,200,300,400,500,600,700,800,900,1000]\n", "\n", "for i in nodes:\n", " start = time.time()\n", " eff = graph.matching_ind_und(W[:i,:i])\n", " eff_comet.append(time.time() - start)\n", "\n", " start = time.time()\n", " eff = bct.matching_ind_und(W[:i,:i])\n", " eff_bct.append(time.time() - start)\n", "\n", "# Plot the results\n", "plt.figure(figsize=(6,4))\n", "plt.title('Matching Index Benchmark')\n", "plt.plot(nodes, eff_comet, label=\"comet\", marker='o')\n", "plt.plot(nodes, eff_bct, label=\"bct\", marker='o')\n", "plt.xlabel('Number of nodes')\n", "plt.xticks(nodes)\n", "plt.ylabel('Time (s)')\n", "plt.legend();" ] } ], "metadata": { "kernelspec": { "display_name": "dfc-multiverse", "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.11.0" } }, "nbformat": 4, "nbformat_minor": 2 }