{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# SocioPatterns" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "autoscroll": false, "collapsed": false, "ein.tags": "worksheet-0", "slideshow": { "slide_type": "-" } }, "outputs": [], "source": [ "import numpy as np\n", "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "%matplotlib inline" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "autoscroll": false, "collapsed": false, "ein.tags": "worksheet-0", "slideshow": { "slide_type": "-" } }, "outputs": [], "source": [ "import igraph as ig\n", "import dionysus as d" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "plt.style.use(\"fivethirtyeight\")\n", "plt.rcParams[\"figure.figsize\"] = 10, 6" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "%load_ext autoreload\n", "%autoreload 2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Data import" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "g = ig.read(\"data/sociopatterns/infectious/infectious.graphml\")" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'IGRAPH UN-- 10972 415912 -- \\n+ attr: id (v), name (v), id (e), time (e)'" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "g.summary()" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "76944" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(np.unique(g.es[\"time\"]))" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "cliques = []\n", "for t in np.unique(g.es[\"time\"]):\n", " edges = g.es.select(time_eq=t)\n", " cliques.append(g.subgraph_edges(edges).maximal_cliques())" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "maxcliques = g.maximal_cliques()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def filt_subgraph(t):\n", " edges = g.es.select(time_eq=t)\n", " cliques = g.subgraph_edges(edges).maximal_cliques()\n", " return d.Filtration(cliques)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "times = np.sort(np.unique(g.es[\"time\"]))" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import multiprocessing" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "pool = multiprocessing.Pool(processes=multiprocessing.cpu_count())\n", "cliques = pool.map(clique_subgraph, times)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "pool.terminate()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "maxcliques = g.subgraph_edges(g.es.select(time_lt=times[30])).maximal_cliques()\n", "filts = [filt_subgraph(t) for t in times[1:30]]" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "maxfilt = d.Filtration(maxcliques)\n", "for s in maxfilt:\n", " print(s)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "presences = [[s in filt for filt in filts] for s in maxfilt]" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "presences[-1]" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "[np.argwhere(np.array(p)[1:] ^ np.array(p)[:-1]).flatten().tolist() for p in presences]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Cut into sliding windows" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "duration = 0.1 * (times.max() - times.min())\n", "duration * np.arange(10)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### TODO overlap" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "def sliding_windows(g, res=0.1, overlap=0):\n", " times = np.array(g.es[\"time\"])\n", " duration = res * (times.max() - times.min())\n", " windows = []\n", " for i in range(int(1/res)-1):\n", " edges = g.es.select(time_gt=times.min() + duration*i, time_lt=times.min() + duration*(i+1))\n", " windows.append(g.subgraph_edges(edges))\n", " return windows" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "wins = sliding_windows(g, 0.1)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1241607579.0\n", "1242302279.0\n", "1242996839.0\n", "1243691539.0\n", "1244386179.0\n", "1244995999.0\n", "1245775339.0\n", "1246468459.0\n", "1247162039.0\n" ] } ], "source": [ "for i in wins:\n", " print(max(i.es[\"time\"]))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Zigzag persistence" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Compute the maximal simplicial complex" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "def max_simplicial_complex(g):\n", " return d.Filtration(g.maximal_cliques())" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "def presence_times(g):\n", " max_simplicial_complex = d.Filtration(g.cliques())\n", " filts = []\n", " for t in np.sort(np.unique(g.es[\"time\"])):\n", " edges = g.es.select(time_eq=t)\n", " cliques = g.subgraph_edges(edges).cliques()\n", " filts.append(d.Filtration(cliques))\n", " presences = [[s in filt for filt in filts] for s in max_simplicial_complex]\n", " presences = [np.argwhere(np.array(p)[1:] ^ np.array(p)[:-1]).flatten().tolist() for p in presences]\n", " return (max_simplicial_complex, presences)" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "(f, t) = presence_times(wins[2])" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "zz, dgms, cells = d.zigzag_homology_persistence(f, t)" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "ename": "NameError", "evalue": "name 'd' is not defined", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0;32mfor\u001b[0m \u001b[0ms\u001b[0m \u001b[0;32min\u001b[0m \u001b[0md\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mFiltration\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0md\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mSimplex\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ms\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mNameError\u001b[0m: name 'd' is not defined" ] } ], "source": [ "for s in d.Filtration([d.Simplex((0,1,2))]):\n", " print(s)" ] }, { "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 }