{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# CS579: Lecture 06  \n",
    "** Graph Partitioning **\n",
    "\n",
    "*[Dr. Aron Culotta](http://cs.iit.edu/~culotta)*  \n",
    "*[Illinois Institute of Technology](http://iit.edu)*\n",
    "\n",
    "<br><br><br><br><br><br>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "Recall the network from last lecture:\n",
    "\n",
    "![network](network.png)\n",
    "\n",
    "We identified edge $(B,D)$ as a good candidate to remove to create two clusters based on *betweenness*."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "Today we'll discuss an alternative clustering approach based on *graph cuts.*\n",
    "\n",
    "- A **cut** $C=(S,T)$ partitions the vertices $V$ of a graph into two subsets $S$ and $T$.\n",
    "- The **cut-set** of $C$ is the set of edges that have one endpoint in $S$ and the other in $T$\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "**What makes a good cut?**\n",
    "\n",
    "<br><br>\n",
    "\n",
    "![partition](partition.png)\n",
    "\n",
    "The cut-set $\\{(H,C)\\}$ is smaller than the set $\\{(B,D), (C,G)\\}$. \n",
    "\n",
    "Why might we not like cut $\\{(H,C)\\}$?"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "A good cut is:\n",
    "\n",
    "- small\n",
    "- balanced\n",
    "\n",
    "How to quantify these?\n",
    "<br><br><br>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "$Vol(S)$: **volume** of a set of $S$ nodes is the number of edges with at least one end in $S$.\n",
    "\n",
    "![partition](partition.png)\n",
    "\n",
    "$Vol(\\{A,B,C\\})=6$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "Let $Cut(S,T)$ be the number of edges in cut-set of cut $C=(S,T)$ (the cut **size**).\n",
    "\n",
    "The **normalized cut value** for $(S,T)$ is:\n",
    "\n",
    "$$NCV(S,T) = \\frac{Cut(S,T)}{Vol(S)} + \\frac{Cut(S,T)}{Vol(T)}$$\n",
    "\n",
    "![partition](partition.png)\n",
    "\n",
    "Example:\n",
    "\n",
    "Consider the cut where $S=\\{H\\}$ and $T=\\{A,B,C,D,E,F,G\\}$.\n",
    "\n",
    "- $Cut(S,T) = 1$\n",
    "- $Vol(S) = 1$\n",
    "- $Vol(T) = 11$\n",
    "- $NCV(S,T) = \\frac{1}{1} + \\frac{1}{11} = 1.09$\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "![partition](partition.png)\n",
    "\n",
    "Example:\n",
    "\n",
    "Consider the cut where $S=\\{A,B,C,H\\}$ and $T=\\{D,E,F,G\\}$.\n",
    "\n",
    "- $Cut(S,T) = 2$\n",
    "- $Vol(S) = 6$\n",
    "- $Vol(T) = 7$\n",
    "- $NCV(S,T) = \\frac{2}{6} + \\frac{2}{7} = 0.62$\n",
    "\n",
    "So, if one part of the cut has a small volume, the normalized cut value will be large."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Problem:** How do we identify the cut with the smallest normalized cut value?\n",
    "\n",
    "<br><br><br><br>\n",
    "Like most good things, it is NP-hard."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Linear algebra to the rescue!**\n",
    "\n",
    "Below, we describe a way to approximate the optimal cuts using eigenvalue decomposition."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "** Representing Graphs with Matrices **\n",
    "\n",
    "- **Adjacency matrix** $A$:  &nbsp;&nbsp;&nbsp; $A[i, j] = 1$ iff there is an edge from $i$ to $j$.\n",
    "- **Degree matrix** $D$:  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $D[i, i] = deg(i)$, else 0\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import warnings\n",
    "warnings.filterwarnings(\"ignore\")\n",
    "%matplotlib inline \n",
    "import matplotlib.pyplot as plt\n",
    "import networkx as nx\n",
    "graph = nx.Graph()\n",
    "graph.add_edges_from([('A', 'B'), ('A', 'C'), ('B', 'C'), ('B', 'D'), ('D', 'E'), ('D', 'F'), ('D', 'G'), ('E', 'F'), ('G', 'F')])\n",
    "nx.draw(graph, with_labels=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "slideshow": {
     "slide_type": "-"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Adjacency matrix:\n",
      " [[0 1 1 0 0 0 0]\n",
      " [1 0 1 1 0 0 0]\n",
      " [1 1 0 0 0 0 0]\n",
      " [0 1 0 0 1 1 1]\n",
      " [0 0 0 1 0 1 0]\n",
      " [0 0 0 1 1 0 1]\n",
      " [0 0 0 1 0 1 0]]\n"
     ]
    }
   ],
   "source": [
    "# Print the adjacency matrix.\n",
    "def adjacency_matrix(graph):\n",
    "    return nx.adjacency_matrix(graph, sorted(graph.nodes()))\n",
    "\n",
    "adjacency = adjacency_matrix(graph)\n",
    "print('Adjacency matrix:\\n', adjacency.todense())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "** What data structure should we use to store the adjacency matrix? **\n",
    "\n",
    "<br><br><br><br><br>\n",
    "\n",
    "- Naive 2d array: $O(V^2)$ space, for $V$ vertices.\n",
    "- But, graphs are sparse ($E << V^2$), for $E$ edges.\n",
    "- Instead, only store non-zeros\n",
    "\n",
    "E.g., list of tuples `[(0,1), (0,2), (1,2), ...]`\n",
    "  - Space = $O(E)$\n",
    "  - We'll look at these *sparse matrices* in more detail later."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {
    "slideshow": {
     "slide_type": "-"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Degree matrix:\n",
      " [[2 0 0 0 0 0 0]\n",
      " [0 3 0 0 0 0 0]\n",
      " [0 0 2 0 0 0 0]\n",
      " [0 0 0 4 0 0 0]\n",
      " [0 0 0 0 2 0 0]\n",
      " [0 0 0 0 0 3 0]\n",
      " [0 0 0 0 0 0 2]]\n"
     ]
    }
   ],
   "source": [
    "# Print the degree matrix.\n",
    "import numpy as np\n",
    "\n",
    "def degree_matrix(graph):\n",
    "    degrees = dict(graph.degree()).items()\n",
    "    degrees = sorted(degrees, key=lambda x: x[0])\n",
    "    degrees = [d[1] for d in degrees]\n",
    "    return np.diag(degrees)\n",
    "\n",
    "degree = degree_matrix(graph)\n",
    "print('Degree matrix:\\n', degree)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Laplacian matrix** $L = D - A$\n",
    "\n",
    "- **Adjacency matrix** $A$:  &nbsp;&nbsp;&nbsp; $A[i, j] = 1$ iff there is an edge from $i$ to $j$.\n",
    "- **Degree matrix** $D$:  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $D[i, i] = deg(i)$, else 0\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Laplacian matrix:\n",
      " [[ 2 -1 -1  0  0  0  0]\n",
      " [-1  3 -1 -1  0  0  0]\n",
      " [-1 -1  2  0  0  0  0]\n",
      " [ 0 -1  0  4 -1 -1 -1]\n",
      " [ 0  0  0 -1  2 -1  0]\n",
      " [ 0  0  0 -1 -1  3 -1]\n",
      " [ 0  0  0 -1  0 -1  2]]\n"
     ]
    }
   ],
   "source": [
    "def laplacian_matrix(graph):\n",
    "    return degree_matrix(graph) - adjacency_matrix(graph)\n",
    "\n",
    "laplacian = laplacian_matrix(graph)\n",
    "print('Laplacian matrix:\\n', laplacian)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "**Properties of Laplacian matrix:**\n",
    "- rows sum to 0; columns sum to 0\n",
    "- symmetric\n",
    "- positive-semidefinite &nbsp;&nbsp; ($z^TLz \\ge 0$ &nbsp;&nbsp;&nbsp; $\\forall $ nonzero $z$)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "** Recall that a matrix is a way to represent a linear transformation.**\n",
    "\n",
    "For an arbitrary vector $v$, what does $Lv$ mean?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# For a smaller graph.\n",
    "graph2 = nx.Graph()\n",
    "graph2.add_edges_from([('A', 'B'), ('B', 'C')])\n",
    "nx.draw(graph2, with_labels=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[ 1 -1  0]\n",
      " [-1  2 -1]\n",
      " [ 0 -1  1]]\n"
     ]
    }
   ],
   "source": [
    "laplacian2 = laplacian_matrix(graph2)\n",
    "print(laplacian2)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let $v$ be a map from nodes to real values. \n",
    "\n",
    "E.g., $v = \\{f(A), f(B), f(C)\\}$\n",
    "\n",
    "Then, $Lv$ is:\n",
    "\n",
    "$$ \\begin{pmatrix}\n",
    "  1 & -1 & 0 \\\\\n",
    "  -1 & 2 & -1 \\\\\n",
    "  0 & -1 & 1\n",
    " \\end{pmatrix}\n",
    " \\begin{pmatrix}\n",
    " f(A)\\\\\n",
    " f(B)\\\\\n",
    " f(C)\\\\\n",
    " \\end{pmatrix}\n",
    " =\n",
    " \\begin{pmatrix}\n",
    "  f(A) - f(B)\\\\\n",
    "  -f(A) + 2f(B) - f(C)\\\\\n",
    "  -f(B) + f(C)\n",
    " \\end{pmatrix}$$\n",
    " \n",
    "More generally:\n",
    "\n",
    "$Lv[i]= [deg(i) ∗ (f(i) − $average of $f$ on neighbors of $i)]$\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[-1  0  1]]\n"
     ]
    }
   ],
   "source": [
    "print(laplacian2.dot([1,2,3]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[ 1  0 -1]]\n"
     ]
    }
   ],
   "source": [
    "print(laplacian2.dot([3,2,1]))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "** Review of Linear Algebra**\n",
    "\n",
    "A vector $\\mathbf{v}$ of dimension $n$ is an **eigenvector **of a square $(n×n)$ matrix $A$ if and only if \n",
    "$$ A \\mathbf{v} = \\lambda \\mathbf{v}  $$\n",
    "\n",
    "where $\\lambda$ is a scalar, called an **eigenvalue**.\n",
    "\n",
    "In otherwords, $\\mathbf{v}$ is just a linear scaling of $A$.\n",
    "\n",
    "<br><br><br><br>\n",
    "Assume $A$ has $n$ linearly independent eigenvectors, $\\{\\mathbf{v}_1 \\ldots \\mathbf{v}_n\\}$. \n",
    "\n",
    "**eigenvector matrix**: Let $V$ be a square matrix where column $i$ is $\\mathbf{v}_i$\n",
    "\n",
    "Then A can be factorized as\n",
    "$A=V \\Lambda V^{-1}  $ where\n",
    "\n",
    "**eigenvalue matrix:** $\\Lambda$ is a diagonal matrix of eigenvalues: $\\Lambda[i, i]=\\lambda_i$.\n",
    "\n",
    "(c.f. Principal Component Analysis.)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "![eval](http://upload.wikimedia.org/wikipedia/commons/thumb/5/58/Eigenvalue_equation.svg/375px-Eigenvalue_equation.svg.png)\n",
    "\n",
    "[source](http://en.wikipedia.org/wiki/Eigenvalues_and_eigenvectors)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "**What happens when we compute the eigenvalue decomposition of the Laplacian $L$**?\n",
    "\n",
    "- Smallest eigenvalue $\\lambda_0=0$\n",
    "  - Corresponding eigenvector $\\mathbf{v}_0 = \\mathbf{1}$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[0 0 0]]\n"
     ]
    }
   ],
   "source": [
    "print(laplacian2.dot([1,1,1]))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "**What about second eigenvector?**\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "collapsed": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Help on function eigh in module numpy.linalg:\n",
      "\n",
      "eigh(a, UPLO='L')\n",
      "    Return the eigenvalues and eigenvectors of a complex Hermitian\n",
      "    (conjugate symmetric) or a real symmetric matrix.\n",
      "    \n",
      "    Returns two objects, a 1-D array containing the eigenvalues of `a`, and\n",
      "    a 2-D square array or matrix (depending on the input type) of the\n",
      "    corresponding eigenvectors (in columns).\n",
      "    \n",
      "    Parameters\n",
      "    ----------\n",
      "    a : (..., M, M) array\n",
      "        Hermitian or real symmetric matrices whose eigenvalues and\n",
      "        eigenvectors are to be computed.\n",
      "    UPLO : {'L', 'U'}, optional\n",
      "        Specifies whether the calculation is done with the lower triangular\n",
      "        part of `a` ('L', default) or the upper triangular part ('U').\n",
      "        Irrespective of this value only the real parts of the diagonal will\n",
      "        be considered in the computation to preserve the notion of a Hermitian\n",
      "        matrix. It therefore follows that the imaginary part of the diagonal\n",
      "        will always be treated as zero.\n",
      "    \n",
      "    Returns\n",
      "    -------\n",
      "    w : (..., M) ndarray\n",
      "        The eigenvalues in ascending order, each repeated according to\n",
      "        its multiplicity.\n",
      "    v : {(..., M, M) ndarray, (..., M, M) matrix}\n",
      "        The column ``v[:, i]`` is the normalized eigenvector corresponding\n",
      "        to the eigenvalue ``w[i]``.  Will return a matrix object if `a` is\n",
      "        a matrix object.\n",
      "    \n",
      "    Raises\n",
      "    ------\n",
      "    LinAlgError\n",
      "        If the eigenvalue computation does not converge.\n",
      "    \n",
      "    See Also\n",
      "    --------\n",
      "    eigvalsh : eigenvalues of real symmetric or complex Hermitian\n",
      "               (conjugate symmetric) arrays.\n",
      "    eig : eigenvalues and right eigenvectors for non-symmetric arrays.\n",
      "    eigvals : eigenvalues of non-symmetric arrays.\n",
      "    \n",
      "    Notes\n",
      "    -----\n",
      "    \n",
      "    .. versionadded:: 1.8.0\n",
      "    \n",
      "    Broadcasting rules apply, see the `numpy.linalg` documentation for\n",
      "    details.\n",
      "    \n",
      "    The eigenvalues/eigenvectors are computed using LAPACK routines ``_syevd``,\n",
      "    ``_heevd``.\n",
      "    \n",
      "    The eigenvalues of real symmetric or complex Hermitian matrices are\n",
      "    always real. [1]_ The array `v` of (column) eigenvectors is unitary\n",
      "    and `a`, `w`, and `v` satisfy the equations\n",
      "    ``dot(a, v[:, i]) = w[i] * v[:, i]``.\n",
      "    \n",
      "    References\n",
      "    ----------\n",
      "    .. [1] G. Strang, *Linear Algebra and Its Applications*, 2nd Ed., Orlando,\n",
      "           FL, Academic Press, Inc., 1980, pg. 222.\n",
      "    \n",
      "    Examples\n",
      "    --------\n",
      "    >>> from numpy import linalg as LA\n",
      "    >>> a = np.array([[1, -2j], [2j, 5]])\n",
      "    >>> a\n",
      "    array([[ 1.+0.j, -0.-2.j],\n",
      "           [ 0.+2.j,  5.+0.j]])\n",
      "    >>> w, v = LA.eigh(a)\n",
      "    >>> w; v\n",
      "    array([0.17157288, 5.82842712])\n",
      "    array([[-0.92387953+0.j        , -0.38268343+0.j        ], # may vary\n",
      "           [ 0.        +0.38268343j,  0.        -0.92387953j]])\n",
      "    \n",
      "    >>> np.dot(a, v[:, 0]) - w[0] * v[:, 0] # verify 1st e-val/vec pair\n",
      "    array([5.55111512e-17+0.0000000e+00j, 0.00000000e+00+1.2490009e-16j])\n",
      "    >>> np.dot(a, v[:, 1]) - w[1] * v[:, 1] # verify 2nd e-val/vec pair\n",
      "    array([0.+0.j, 0.+0.j])\n",
      "    \n",
      "    >>> A = np.matrix(a) # what happens if input is a matrix object\n",
      "    >>> A\n",
      "    matrix([[ 1.+0.j, -0.-2.j],\n",
      "            [ 0.+2.j,  5.+0.j]])\n",
      "    >>> w, v = LA.eigh(A)\n",
      "    >>> w; v\n",
      "    array([0.17157288, 5.82842712])\n",
      "    matrix([[-0.92387953+0.j        , -0.38268343+0.j        ], # may vary\n",
      "            [ 0.        +0.38268343j,  0.        -0.92387953j]])\n",
      "    \n",
      "    >>> # demonstrate the treatment of the imaginary part of the diagonal\n",
      "    >>> a = np.array([[5+2j, 9-2j], [0+2j, 2-1j]])\n",
      "    >>> a\n",
      "    array([[5.+2.j, 9.-2.j],\n",
      "           [0.+2.j, 2.-1.j]])\n",
      "    >>> # with UPLO='L' this is numerically equivalent to using LA.eig() with:\n",
      "    >>> b = np.array([[5.+0.j, 0.-2.j], [0.+2.j, 2.-0.j]])\n",
      "    >>> b\n",
      "    array([[5.+0.j, 0.-2.j],\n",
      "           [0.+2.j, 2.+0.j]])\n",
      "    >>> wa, va = LA.eigh(a)\n",
      "    >>> wb, vb = LA.eig(b)\n",
      "    >>> wa; wb\n",
      "    array([1., 6.])\n",
      "    array([6.+0.j, 1.+0.j])\n",
      "    >>> va; vb\n",
      "    array([[-0.4472136 +0.j        , -0.89442719+0.j        ], # may vary\n",
      "           [ 0.        +0.89442719j,  0.        -0.4472136j ]])\n",
      "    array([[ 0.89442719+0.j       , -0.        +0.4472136j],\n",
      "           [-0.        +0.4472136j,  0.89442719+0.j       ]])\n",
      "\n"
     ]
    }
   ],
   "source": [
    "# Library to compute eigenvectors:\n",
    "from numpy.linalg import eigh\n",
    "help(eigh)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "eigen values\n",
      " [-0.    0.4   2.    3.    3.34  4.    5.26]\n",
      "eigen vectors\n",
      " [[ 0.38  0.49 -0.   -0.71 -0.32  0.   -0.11]\n",
      " [ 0.38  0.3   0.    0.    0.75 -0.    0.45]\n",
      " [ 0.38  0.49 -0.    0.71 -0.32  0.   -0.11]\n",
      " [ 0.38 -0.21  0.    0.    0.39 -0.   -0.81]\n",
      " [ 0.38 -0.36  0.71 -0.   -0.17 -0.41  0.19]\n",
      " [ 0.38 -0.36 -0.   -0.   -0.17  0.82  0.19]\n",
      " [ 0.38 -0.36 -0.71 -0.   -0.17 -0.41  0.19]]\n"
     ]
    }
   ],
   "source": [
    "eig_vals, eig_vectors = eigh(laplacian)\n",
    "# round them for prettier printing\n",
    "eig_vals = np.round(eig_vals, 2)\n",
    "eig_vectors = np.round(eig_vectors, 2)\n",
    "print('eigen values\\n', eig_vals)\n",
    "print('eigen vectors\\n',np.round(eig_vectors, 2))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "first eigen value=-0\n",
      "first (normalized) eigen vector=\n",
      "[0.38 0.38 0.38 0.38 0.38 0.38 0.38]\n"
     ]
    }
   ],
   "source": [
    "print('first eigen value=%g' % eig_vals[0])\n",
    "print('first (normalized) eigen vector=\\n%s' % eig_vectors[:,0])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Eigen vectors have been normalized to unit length by \n",
    "\n",
    "$$ v = \\frac{v'}{||v'||} $$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.37796447, 0.37796447, 0.37796447, 0.37796447, 0.37796447,\n",
       "       0.37796447, 0.37796447])"
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "v = np.array([1, 1, 1, 1, 1, 1, 1])\n",
    "v / (np.sqrt(np.sum(v**2)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "second eigen value=0.40\n",
      "second eigen vector=\n",
      "[ 0.49  0.3   0.49 -0.21 -0.36 -0.36 -0.36]\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "print('second eigen value=%.2f' % eig_vals[1])\n",
    "print('second eigen vector=\\n%s' % eig_vectors[:,1])\n",
    "nx.draw(graph, with_labels=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "What do you notice about the second eigenvector?\n",
    "\n",
    "(Note that first vector component corresponds to node 'A', the second to 'B', etc.)\n",
    "<br><br><br><br>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can think of eigenvectors as the cluster assignment to each node.\n",
    "\n",
    "E.g., nodes with negative values are in cluster 1, nodes with positive values are in cluster 2."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "**From eigenvalues to clustering**\n",
    "\n",
    "Method 1:\n",
    "- Compute decomposition and examine second eigenvector\n",
    "- Place nodes of positive values in cluster 1, negative values in cluster 2."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "**From eigenvalues to clustering**\n",
    "\n",
    "Method 2:\n",
    "- Compute decomposition and examine second eigenvector\n",
    "- Place nodes of values greather than $\\tau$ in cluster 1, and the remainder in cluster 2.\n",
    "  - The threshold $\\tau$ will determine balance of clustering\n",
    "  - E.g., for $\\tau=-.3$?"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "**Partitioning into more than 2 components?**\n",
    "\n",
    "- Just recursively repeat the above procedure."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "\n",
    "- Or, consider multiple eigen vectors simultaneously."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Interesting property of the second smallest eigenvalue -- it is a measure of the density of the graph.\n",
    "\n",
    "The growth rate of the second smallest eigenvalue as the density of the graph increases.\n",
    "\n",
    "<img src=\"https://samidavies.files.wordpress.com/2016/09/increasing_eigenvalue.png?w=768\">\n",
    "\n",
    "See <https://samidavies.wordpress.com/2016/09/20/whats-up-with-the-graph-laplacian/>\n",
    "\n",
    "Second eigenvector indicates which vertices are in the dense parts of the graph. \n",
    "\n",
    "| A | B | C | D | E | F | G |\n",
    "|---|---|---|---|---|---|---|\n",
    "|0.49|  0.3 |  0.49 |-0.21 |-0.36| -0.36| -0.36|\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "nx.draw(graph, with_labels=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "third eigen value=2.00\n",
      "third eigen vector=\n",
      "[-0.    0.   -0.    0.    0.71 -0.   -0.71]\n"
     ]
    }
   ],
   "source": [
    "print('third eigen value=%.2f' % eig_vals[2])\n",
    "print('third eigen vector=\\n%s' % eig_vectors[:,2])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "$\\mathbf{v}_1: \\{A,B,C\\}, \\{D,E,F,G\\}$\n",
    "\n",
    "$\\mathbf{v}_2: \\{A,B,D,E,F\\}, \\{C,G\\}$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "fourth eigen value=3.00\n",
      "fourth eigen vector=\n",
      "[-0.71  0.    0.71  0.   -0.   -0.   -0.  ]\n"
     ]
    }
   ],
   "source": [
    "print('fourth eigen value=%.2f' % eig_vals[3])\n",
    "print('fourth eigen vector=\\n%s' % eig_vectors[:,3])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "$\\mathbf{v}_1: \\{A,B,C\\}, \\{D,E,F,G\\}$\n",
    "\n",
    "$\\mathbf{v}_2: \\{A,B,C,D,E\\}, \\{C,G\\}$\n",
    "    \n",
    "$\\mathbf{v}_3: \\{A,E,F,G\\}, \\{B,C,D\\}$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "Method 3:\n",
    "- Represent each node by all of its eigenvectors\n",
    "- Cluster the result using a standard algorithm like $k$-means"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 0.38,  0.49, -0.  , -0.71, -0.32,  0.  , -0.11])"
      ]
     },
     "execution_count": 39,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# get first row of eigenvector matrix.\n",
    "# this is a vector to represent node A\n",
    "eig_vectors[0,:]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 0.38,  0.3 ,  0.  ,  0.  ,  0.75, -0.  ,  0.45])"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# get second row of eigenvector matrix.\n",
    "# this is a vector to represent node B\n",
    "eig_vectors[1,:]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 0.38,  0.49, -0.  ,  0.71, -0.32,  0.  , -0.11])"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# get second row of eigenvector matrix.\n",
    "# this is a vector to represent node C\n",
    "eig_vectors[2,:]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "A 0.49 -0.0\n",
      "B 0.3 0.0\n",
      "C 0.49 -0.0\n",
      "D -0.21 0.0\n",
      "E -0.36 0.71\n",
      "F -0.36 -0.0\n",
      "G -0.36 -0.71\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# plot each point using 2nd and 3rd eigen vector\n",
    "def plot_by_eigenvectors(eig_vectors):\n",
    "    plt.figure()\n",
    "    for i, name in enumerate(['A', 'B', 'C', 'D', 'E', 'F', 'G']):\n",
    "        v1 = eig_vectors[i, 1]\n",
    "        v2 = eig_vectors[i, 2]\n",
    "        plt.annotate(name, xy=(v1, v2))\n",
    "        print(name, v1, v2)\n",
    "    plt.xlim(-.5,.5)\n",
    "    plt.ylim(-.8,.8)\n",
    "    plt.xlabel('second eigenvector value')\n",
    "    plt.ylabel('third eigenvector value')\n",
    "    plt.show()\n",
    "    \n",
    "plot_by_eigenvectors(eig_vectors)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<link href=\"https://fonts.googleapis.com/css?family=Droid+Sans+Mono\" rel=\"stylesheet\" type='text/css'>\n",
       "\n",
       "<link href=\"https://fonts.googleapis.com/css?family=Exo+2\" rel=\"stylesheet\" type='text/css'>\n",
       "\n",
       "<link href=\"https://fonts.googleapis.com/css?family=Lora\" rel=\"stylesheet\" type='text/css'>\n",
       "\n",
       "<link href=\"https://fonts.googleapis.com/css?family=Fira+Mono\" rel=\"stylesheet\" type='text/css'>\n",
       "\n",
       "<style>\n",
       "\n",
       "div#site {\n",
       "    height: 100% !important;\n",
       "}\n",
       "\n",
       "strong {\n",
       "  font-weight: 900 !important;\n",
       "}\n",
       "\n",
       ".container { width:90% !important; }\n",
       "\n",
       "\n",
       "div#notebook {\n",
       " font-family: \"Exo_2\", sans-serif;\n",
       " font-size: 20pt;\n",
       " line-height: 170%;\n",
       " color: #303030;\n",
       "}\n",
       "body,\n",
       "div.body {\n",
       " font-family: \"Exo_2\", sans-serif;\n",
       " font-size: 20pt;\n",
       " color: #303030;\n",
       " background-color: #ffffff;\n",
       " background: #ffffff;\n",
       "}\n",
       "body.notebook_app {\n",
       " padding: 0;\n",
       " background-color: #ffffff;\n",
       " background: #ffffff;\n",
       " padding-right: 0px !important;\n",
       " overflow-y: hidden;\n",
       "}\n",
       "a {\n",
       " font-family: \"Exo_2\", sans-serif;\n",
       " color: #303030;\n",
       "}\n",
       "a:hover,\n",
       "a:focus {\n",
       " color: #2f2f2f;\n",
       "}\n",
       ".list_header,\n",
       "div#notebook_list_header.row.list_header {\n",
       " font-size: 20pt;\n",
       " color: #2f2f2f;\n",
       " background-color: #ffffff;\n",
       "}\n",
       "div#cluster_list_header.row.list_header,\n",
       "div#running .row.list_header {\n",
       " font-size: 20pt;\n",
       " color: #303030;\n",
       " background: #eeeeee;\n",
       " background-color: #eeeeee;\n",
       " border-bottom: 2px solid rgba(180,180,180,.30);\n",
       "}\n",
       "div#cluster_list > div.list_item.row,\n",
       "div#cluster_list > div.list_item.row:hover {\n",
       " background: #fafafa;\n",
       " background-color: #fafafa;\n",
       "}\n",
       "div#clusters.tab-pane.active {\n",
       " font-size: 12.0pt;\n",
       " padding: 4px 0 4px 0;\n",
       "}\n",
       "#running .panel-group .panel .panel-heading {\n",
       " font-size: 14pt;\n",
       " color: #303030;\n",
       " padding: 8px 8px;\n",
       " background: #eeeeee;\n",
       " background-color: #eeeeee;\n",
       "}\n",
       "#running .panel-group .panel .panel-heading a {\n",
       " font-size: 14pt;\n",
       " color: #303030;\n",
       "}\n",
       "#running .panel-group .panel .panel-heading a:focus,\n",
       "#running .panel-group .panel .panel-heading a:hover {\n",
       " font-size: 14pt;\n",
       " color: #303030;\n",
       "}\n",
       "#running .panel-group .panel .panel-body .list_container .list_item {\n",
       " background: #fafafa;\n",
       " background-color: #fafafa;\n",
       " padding: 2px;\n",
       " border-bottom: 2px solid rgba(180,180,180,.30);\n",
       "}\n",
       "#running .panel-group .panel .panel-body .list_container .list_item:hover {\n",
       " background: #fafafa;\n",
       " background-color: #fafafa;\n",
       "}\n",
       "#running .panel-group .panel .panel-body {\n",
       " padding: 2px;\n",
       "}\n",
       "div.running_list_info.toolbar_info {\n",
       " font-size: 12.0pt;\n",
       " padding: 4px 0 4px 0;\n",
       " height: inherit;\n",
       " line-height: inherit;\n",
       " text-shadow: none;\n",
       "}\n",
       ".list_placeholder {\n",
       " font-weight: normal;\n",
       "}\n",
       "#tree-selector {\n",
       " padding: 0px;\n",
       "}\n",
       "#project_name > ul > li > a > i.fa.fa-home {\n",
       " color: #ff7823;\n",
       " font-size: 17pt;\n",
       " display: inline-block;\n",
       " position: static;\n",
       " padding: 0px 0px;\n",
       " font-weight: normal;\n",
       " text-align: center;\n",
       " vertical-align: text-top;\n",
       "}\n",
       "#project_name {\n",
       " display: inline-flex;\n",
       " padding-left: 7px;\n",
       " margin-left: -2px;\n",
       " margin-bottom: -20px;\n",
       " text-align: -webkit-auto;\n",
       " vertical-align: text-top;\n",
       "}\n",
       "div#notebook_toolbar div.dynamic-instructions {\n",
       " font-family: \"Exo_2\", sans-serif;\n",
       " font-size: 12.0pt;\n",
       "}\n",
       ".toolbar_info {\n",
       " font-family: \"Exo_2\", sans-serif;\n",
       " font-size: 12.0pt;\n",
       " color: #303030;\n",
       " text-shadow: none;\n",
       " border: none;\n",
       " height: inherit;\n",
       " line-height: inherit;\n",
       "}\n",
       ".list_container {\n",
       " font-size: 12.0pt;\n",
       " color: #303030;\n",
       " border: none;\n",
       " text-shadow: none !important;\n",
       "}\n",
       ".list_container > div {\n",
       " border-bottom: 1px solid rgba(180,180,180,.14);\n",
       " font-size: 12.0pt;\n",
       "}\n",
       ".list_header > div,\n",
       ".list_item > div {\n",
       " padding-left: 0px;\n",
       "}\n",
       ".list_header > div input,\n",
       ".list_item > div input {\n",
       " top: 0px;\n",
       "}\n",
       ".list_header > div .item_link,\n",
       ".list_item > div .item_link {\n",
       " margin-left: -1px;\n",
       " vertical-align: middle;\n",
       " line-height: 22px;\n",
       " font-size: 12.0pt;\n",
       "}\n",
       ".item_icon {\n",
       " font-size: 12.0pt;\n",
       " vertical-align: middle;\n",
       "}\n",
       ".list_item input:not([type=\"checkbox\"]) {\n",
       " padding-right: 0px;\n",
       " height: auto;\n",
       " width: 20%;\n",
       " margin: 6px 0 0;\n",
       " margin-top: 1px;\n",
       "}\n",
       "#button-select-all {\n",
       " height: auto;\n",
       " font-size: 12.0pt;\n",
       " padding: 5px;\n",
       " min-width: 65px;\n",
       " z-index: 0;\n",
       "}\n",
       "button#tree-selector-btn {\n",
       " height: auto;\n",
       " font-size: 12.0pt;\n",
       " padding: 5px;\n",
       "}\n",
       "input#select-all.pull-left.tree-selector {\n",
       " margin-left: 7px;\n",
       " margin-right: 2px;\n",
       " margin-top: 5px;\n",
       "}\n",
       "input[type=\"radio\"],\n",
       "input[type=\"checkbox\"] {\n",
       " margin: 6px 0 0;\n",
       " margin-top: 1px;\n",
       " line-height: normal;\n",
       "}\n",
       ".list_container a {\n",
       " font-size: 17px;\n",
       " color: #303030;\n",
       " border: none;\n",
       " text-shadow: none !important;\n",
       " font-weight: normal;\n",
       " font-style: normal;\n",
       "}\n",
       "div.list_container a:hover {\n",
       " color: #2f2f2f;\n",
       "}\n",
       "div.list_item:hover {\n",
       " background-color: #fafafa;\n",
       "}\n",
       ".breadcrumb > li {\n",
       " font-size: 12.0pt;\n",
       " color: #303030;\n",
       " border: none;\n",
       " text-shadow: none !important;\n",
       "}\n",
       "ul#tabs a {\n",
       " font-family: \"Exo_2\", sans-serif;\n",
       " font-size: 13pt;\n",
       " font-weight: normal;\n",
       " font-style: normal;\n",
       " border-color: transparent;\n",
       " text-shadow: none !important;\n",
       "}\n",
       ".nav-tabs {\n",
       " font-family: \"Exo_2\", sans-serif;\n",
       " font-size: 13pt;\n",
       " font-weight: normal;\n",
       " font-style: normal;\n",
       " background: #ffffff;\n",
       " text-shadow: none !important;\n",
       " border-color: transparent;\n",
       " border-bottom-color: rgba(180,180,180,.30);\n",
       "}\n",
       ".nav-tabs > li > a:hover {\n",
       " color: #2f2f2f;\n",
       " background-color: rgba(180,180,180,.14);\n",
       "}\n",
       ".nav-tabs > li > a:active,\n",
       ".nav-tabs > li > a:focus,\n",
       ".nav-tabs > li.active > a,\n",
       ".nav-tabs > li.active > a:focus,\n",
       ".nav-tabs > li.active > a:hover,\n",
       ".nav-tabs > li.active > a,\n",
       ".nav-tabs > li.active > a:hover,\n",
       ".nav-tabs > li.active > a:focus {\n",
       " color: #1c1c1c;\n",
       " background-color: #eeeeee;\n",
       " border: 1px solid transparent;\n",
       " border-bottom-color: transparent;\n",
       " cursor: default;\n",
       "}\n",
       ".nav > li > a:hover,\n",
       ".nav > li > a:focus {\n",
       " text-decoration: none;\n",
       " background-color: rgba(180,180,180,.14);\n",
       "}\n",
       ".nav > li.disabled > a,\n",
       ".nav > li.disabled > a:hover {\n",
       " color: #aaaaaa;\n",
       "}\n",
       "div#notebook {\n",
       " font-family: \"Exo_2\", sans-serif;\n",
       " font-size: 20pt;\n",
       " padding-top: 4px;\n",
       "}\n",
       ".notebook_app {\n",
       " background-color: #ffffff;\n",
       "}\n",
       "#notebook-container {\n",
       " padding: 13px;\n",
       " background-color: #ffffff;\n",
       " min-height: 0px;\n",
       " box-shadow: none;\n",
       " width: 980px;\n",
       " margin-right: auto;\n",
       " margin-left: auto;\n",
       "}\n",
       "div#ipython-main-app.container {\n",
       " width: 980px;\n",
       " margin-right: auto;\n",
       " margin-left: auto;\n",
       " margin-right: auto;\n",
       " margin-left: auto;\n",
       "}\n",
       ".container {\n",
       " width: 980px;\n",
       " margin-right: auto;\n",
       " margin-left: auto;\n",
       "}\n",
       ".notebook_app #header {\n",
       " box-shadow: none !important;\n",
       " background-color: #ffffff;\n",
       " border-bottom: 2px solid rgba(180,180,180,.14);\n",
       "}\n",
       "#header {\n",
       " font-family: \"Exo_2\", sans-serif;\n",
       " font-size: 22pt;\n",
       " box-shadow: none;\n",
       " background-color: #ffffff;\n",
       "}\n",
       "#header .header-bar {\n",
       " background: #ffffff;\n",
       " background-color: #ffffff;\n",
       "}\n",
       "body > #header .header-bar {\n",
       " width: 100%;\n",
       " background: #ffffff;\n",
       "}\n",
       "#menubar {\n",
       " background-color: #ffffff;\n",
       "}\n",
       "#menubar .navbar,\n",
       ".navbar-default {\n",
       " background-color: #ffffff;\n",
       " margin-bottom: 0px;\n",
       " margin-top: 5px;\n",
       "}\n",
       ".navbar {\n",
       " border: none;\n",
       "}\n",
       "div.navbar-text,\n",
       ".navbar-text {\n",
       " margin-top: 6px !important;\n",
       " margin-bottom: 0px;\n",
       "}\n",
       ".navbar-default {\n",
       " font-family: \"Exo_2\", sans-serif;\n",
       " font-size: 13pt;\n",
       " background-color: #ffffff;\n",
       " border-color: rgba(180,180,180,.14);\n",
       " line-height: 1.5em;\n",
       " padding-bottom: 0px;\n",
       "}\n",
       ".navbar-default .navbar-nav > li > a {\n",
       " font-family: \"Exo_2\", sans-serif;\n",
       " font-size: 13pt;\n",
       " color: #303030;\n",
       " display: block;\n",
       " line-height: 1.5em;\n",
       " padding-top: 9px;\n",
       " padding-bottom: 6px;\n",
       "}\n",
       ".navbar-default .navbar-nav > li > a:hover,\n",
       ".navbar-default .navbar-nav > li > a:focus {\n",
       " color: #2f2f2f;\n",
       " background-color: rgba(180,180,180,.14);\n",
       " border-color: rgba(180,180,180,.14);\n",
       " line-height: 1.5em;\n",
       "}\n",
       ".navbar-default .navbar-nav > .open > a,\n",
       ".navbar-default .navbar-nav > .open > a:hover,\n",
       ".navbar-default .navbar-nav > .open > a:focus {\n",
       " color: #1c1c1c;\n",
       " background-color: rgba(180,180,180,.14);\n",
       " border-color: rgba(180,180,180,.14);\n",
       " line-height: 1.5em;\n",
       "}\n",
       ".edit_mode .modal_indicator:before {\n",
       " font-size: 15pt;\n",
       " color: #2c85f7;\n",
       " content: \"\\f040\";\n",
       " padding-top: 5px;\n",
       " padding-bottom: 0px;\n",
       " vertical-align: bottom;\n",
       "}\n",
       ".command_mode .modal_indicator:before {\n",
       " font-size: 17pt;\n",
       " color: #2c85f7;\n",
       " content: \"\\f1f9\";\n",
       " padding-top: 5px;\n",
       " padding-bottom: 0px;\n",
       " vertical-align: bottom;\n",
       "}\n",
       ".item_icon {\n",
       " color: #126dce;\n",
       "}\n",
       ".item_buttons .kernel-name {\n",
       " font-size: 13pt;\n",
       " color: #126dce;\n",
       " line-height: 22px;\n",
       "}\n",
       ".running_notebook_icon:before {\n",
       " color: #009e07 !important;\n",
       "}\n",
       ".item_buttons .running-indicator {\n",
       " padding-top: 2px;\n",
       " color: #009e07;\n",
       "}\n",
       "#modal_indicator {\n",
       " float: right !important;\n",
       " color: #126dce;\n",
       " background: #ffffff;\n",
       " background-color: #ffffff;\n",
       "}\n",
       "#kernel_indicator {\n",
       " float: right !important;\n",
       " color: #ff7823;\n",
       " background: #ffffff;\n",
       " background-color: #ffffff;\n",
       " font-size: 16pt;\n",
       " border-left: 2px solid #ff7823;\n",
       " padding-bottom: 2px;\n",
       "}\n",
       "#kernel_indicator .kernel_indicator_name {\n",
       " color: #ff7823;\n",
       " background: #ffffff;\n",
       " background-color: #ffffff;\n",
       " font-size: 16pt;\n",
       " padding-left: 5px;\n",
       " padding-right: 5px;\n",
       " margin-top: 10px;\n",
       " vertical-align: text-bottom;\n",
       " padding-bottom: 0px;\n",
       "}\n",
       "#kernel_indicator .kernel_indicator_name {\n",
       " color: #ff7823;\n",
       " background: #ffffff;\n",
       " background-color: #ffffff;\n",
       " font-size: 15.5pt;\n",
       " padding-left: 5px;\n",
       " padding-right: 5px;\n",
       " margin-top: 10px;\n",
       " vertical-align: text-bottom;\n",
       " padding-bottom: 0px;\n",
       "}\n",
       "div.notification_widget.info,\n",
       ".notification_widget.info,\n",
       ".notification_widget:active:hover,\n",
       ".notification_widget.active:hover,\n",
       ".open > .dropdown-toggle.notification_widget:hover,\n",
       ".notification_widget:active:focus,\n",
       ".notification_widget.active:focus,\n",
       ".open > .dropdown-toggle.notification_widget:focus,\n",
       ".notification_widget:active.focus,\n",
       ".notification_widget.active.focus,\n",
       ".open > .dropdown-toggle.notification_widget.focus,\n",
       "div#notification_notebook.notification_widget.btn.btn-xs.navbar-btn,\n",
       "div#notification_notebook.notification_widget.btn.btn-xs.navbar-btn:hover,\n",
       "div#notification_notebook.notification_widget.btn.btn-xs.navbar-btn:focus {\n",
       " color: #126dce;\n",
       " background-color: #ffffff;\n",
       " border-color: #ffffff;\n",
       "}\n",
       "#notification_area,\n",
       "div.notification_area {\n",
       " float: right !important;\n",
       " position: static;\n",
       "}\n",
       "#kernel_logo_widget,\n",
       "#kernel_logo_widget .current_kernel_logo {\n",
       " display: none;\n",
       "}\n",
       "div#ipython_notebook {\n",
       " display: none;\n",
       "}\n",
       "i.fa.fa-icon {\n",
       " -webkit-font-smoothing: antialiased;\n",
       " -moz-osx-font-smoothing: grayscale;\n",
       " text-rendering: auto;\n",
       "}\n",
       ".fa {\n",
       " display: inline-block;\n",
       " font: normal normal normal 12pt/1 \"FontAwesome\", \"Exo_2\", sans-serif;\n",
       " text-rendering: auto;\n",
       " -webkit-font-smoothing: antialiased;\n",
       " -moz-osx-font-smoothing: grayscale;\n",
       "}\n",
       ".dropdown-menu {\n",
       " font-family: \"Exo_2\", sans-serif;\n",
       " font-size: 13pt;\n",
       " box-shadow: none;\n",
       " padding: 0px;\n",
       " text-align: left;\n",
       " border: 2px solid rgba(180,180,180,.30);\n",
       " background-color: #ffffff;\n",
       " background: #ffffff;\n",
       " line-height: 1.3;\n",
       " margin: 0px;\n",
       "}\n",
       ".dropdown-menu:hover {\n",
       " font-family: \"Exo_2\", sans-serif;\n",
       " font-size: 13pt;\n",
       " border: 2px solid rgba(180,180,180,.30);\n",
       " background-color: #ffffff;\n",
       " box-shadow: none;\n",
       " line-height: 1.3;\n",
       "}\n",
       ".dropdown-header {\n",
       " font-family: \"Exo_2\", sans-serif;\n",
       " font-size: 13pt;\n",
       " display: block;\n",
       " color: #ff7823;\n",
       " text-decoration: underline;\n",
       " white-space: nowrap;\n",
       " padding: 8px 0px 0px 6px;\n",
       " line-height: 1.3;\n",
       "}\n",
       ".dropdown-menu > li > a {\n",
       " font-family: \"Exo_2\", sans-serif;\n",
       " font-size: 12.0pt;\n",
       " line-height: 1.3;\n",
       " display: block;\n",
       " padding: 10px 25px 10px 14px;\n",
       " color: #303030;\n",
       " background-color: #ffffff;\n",
       " background: #ffffff;\n",
       "}\n",
       ".dropdown-menu > li > a:hover {\n",
       " color: #2f2f2f;\n",
       " background-color: rgba(180,180,180,.14);\n",
       " background: rgba(180,180,180,.14);\n",
       " border-color: rgba(180,180,180,.14);\n",
       "}\n",
       ".dropdown-menu .divider {\n",
       " height: 2px;\n",
       " margin: 0px 0px;\n",
       " overflow: hidden;\n",
       " background-color: rgba(180,180,180,.30);\n",
       "}\n",
       ".dropdown-submenu > .dropdown-menu {\n",
       " top: 0;\n",
       " left: 100%;\n",
       " margin-top: -2px;\n",
       " margin-left: 0px;\n",
       " padding-top: 0px;\n",
       "}\n",
       ".dropdown-menu > .disabled > a,\n",
       ".dropdown-menu > .disabled > a:hover,\n",
       ".dropdown-menu > .disabled > a:focus {\n",
       " font-family: \"Exo_2\", sans-serif;\n",
       " font-size: 12.0pt;\n",
       " font-weight: normal;\n",
       " color: #aaaaaa;\n",
       " padding: none;\n",
       " display: block;\n",
       " clear: both;\n",
       " line-height: 1.2;\n",
       " white-space: nowrap;\n",
       "}\n",
       ".dropdown-submenu > a:after {\n",
       " color: #303030;\n",
       " margin-right: -16px;\n",
       "}\n",
       ".dropdown-submenu:hover > a:after,\n",
       ".dropdown-submenu:active > a:after,\n",
       ".dropdown-submenu:focus > a:after,\n",
       ".dropdown-submenu:visited > a:after {\n",
       " color: #ff7823;\n",
       " margin-right: -16px;\n",
       "}\n",
       "div.kse-dropdown > .dropdown-menu,\n",
       ".kse-dropdown > .dropdown-menu {\n",
       " min-width: 0;\n",
       " top: 94%;\n",
       "}\n",
       ".btn,\n",
       ".btn-default {\n",
       " font-family: \"Exo_2\", sans-serif;\n",
       " color: #303030;\n",
       " background: #ebebeb;\n",
       " background-color: #ebebeb;\n",
       " border: 2px solid #e8e8e8;\n",
       " font-weight: normal;\n",
       " box-shadow: none;\n",
       " text-shadow: none;\n",
       " border-radius: 2px;\n",
       " font-size: inherit;\n",
       "}\n",
       ".btn:hover,\n",
       ".btn:active:hover,\n",
       ".btn.active:hover,\n",
       ".btn-default:hover,\n",
       ".open > .dropdown-toggle.btn-default:hover,\n",
       ".open > .dropdown-toggle.btn:hover {\n",
       " color: #2f2f2f;\n",
       " background-color: #e4e4e4;\n",
       " background: #e4e4e4;\n",
       " border-color: #e4e4e4;\n",
       " background-image: none;\n",
       " box-shadow: none !important;\n",
       " border-radius: 2px;\n",
       "}\n",
       ".btn:active,\n",
       ".btn.active,\n",
       ".btn:active:focus,\n",
       ".btn.active:focus,\n",
       ".btn:active.focus,\n",
       ".btn.active.focus,\n",
       ".btn-default:focus,\n",
       ".btn-default.focus,\n",
       ".btn-default:active,\n",
       ".btn-default.active,\n",
       ".btn-default:active:hover,\n",
       ".btn-default.active:hover,\n",
       ".btn-default:active:focus,\n",
       ".btn-default.active:focus,\n",
       ".btn-default:active.focus,\n",
       ".btn-default.active.focus,\n",
       ".open > .dropdown-toggle.btn:focus,\n",
       ".open > .dropdown-toggle.btn.focus,\n",
       ".open > .dropdown-toggle.btn-default {\n",
       " color: #1c1c1c;\n",
       " background-color: #e4e4e4;\n",
       " background: #e4e4e4;\n",
       " border-color: #e4e4e4;\n",
       " background-image: none;\n",
       " box-shadow: none !important;\n",
       " border-radius: 1px;\n",
       "}\n",
       ".item_buttons > .btn,\n",
       ".item_buttons > .btn-group,\n",
       ".item_buttons > .input-group {\n",
       " margin-left: 5px;\n",
       " background: #eeeeee;\n",
       " background-color: #eeeeee;\n",
       " border: 1px solid #eeeeee;\n",
       "}\n",
       ".item_buttons > .btn:hover,\n",
       ".item_buttons > .btn-group:hover,\n",
       ".item_buttons > .input-group:hover {\n",
       " margin-left: 5px;\n",
       " background: #e9e9e9;\n",
       " background-color: #e9e9e9;\n",
       " border: 1px solid #e9e9e9;\n",
       "}\n",
       ".btn-group > .btn-mini,\n",
       ".btn-sm,\n",
       ".btn-group-sm > .btn,\n",
       ".btn-xs,\n",
       ".btn-group-xs > .btn,\n",
       ".alternate_upload .btn-upload,\n",
       ".btn-group,\n",
       ".btn-group-vertical {\n",
       " font-size: 12.0pt;\n",
       " font-weight: normal;\n",
       "}\n",
       ".btn-xs,\n",
       ".btn-group-xs > .btn {\n",
       " font-size: 12.0pt;\n",
       " background-image: none;\n",
       " font-weight: normal;\n",
       " text-shadow: none;\n",
       " display: inline-table;\n",
       "}\n",
       ".btn-group > .btn:first-child {\n",
       " margin-left: 3px;\n",
       "}\n",
       ".alternate_upload .btn-upload {\n",
       " display: none;\n",
       "}\n",
       "button.close {\n",
       " border: 0px none;\n",
       " font-family: sans-serif;\n",
       " font-size: 25pt;\n",
       "}\n",
       ".dynamic-buttons {\n",
       " font-size: inherit;\n",
       " padding-top: 0px;\n",
       " display: inline-block;\n",
       "}\n",
       ".close {\n",
       " color: #de143d;\n",
       " opacity: .5;\n",
       " text-shadow: none;\n",
       "}\n",
       ".close:hover {\n",
       " color: #de143d;\n",
       " opacity: 1;\n",
       "}\n",
       "div.btn.btn-default.output_collapsed {\n",
       " background: #eeeeee;\n",
       " background-color: #eeeeee;\n",
       " border-color: #eeeeee;\n",
       "}\n",
       "div.btn.btn-default.output_collapsed:hover {\n",
       " background: #e9e9e9;\n",
       " background-color: #e9e9e9;\n",
       " border-color: #e9e9e9;\n",
       "}\n",
       "div.nbext-enable-btns .btn[disabled],\n",
       "div.nbext-enable-btns .btn[disabled]:hover,\n",
       ".btn-default.disabled,\n",
       ".btn-default[disabled],\n",
       ".btn-default.disabled:hover,\n",
       ".btn-default[disabled]:hover,\n",
       "fieldset[disabled] .btn-default:hover,\n",
       ".btn-default.disabled:focus,\n",
       ".btn-default[disabled]:focus,\n",
       "fieldset[disabled] .btn-default:focus,\n",
       ".btn-default.disabled.focus,\n",
       ".btn-default[disabled].focus,\n",
       "fieldset[disabled] .btn-default.focus {\n",
       " color: #4a4a4a;\n",
       " background: #e8e8e8;\n",
       " background-color: #e8e8e8;\n",
       " border-color: #e8e8e8;\n",
       "}\n",
       ".input-group-addon {\n",
       " padding: 2px 5px;\n",
       " font-size: 12.0pt;\n",
       " font-weight: normal;\n",
       " height: auto;\n",
       " color: #303030;\n",
       " text-align: center;\n",
       " background-color: #ffffff;\n",
       " border: none;\n",
       "}\n",
       ".btn-group > .btn + .dropdown-toggle {\n",
       " padding-left: 8px;\n",
       " padding-right: 8px;\n",
       " height: 100%;\n",
       " border-left: 2px solid #ff7823 !important;\n",
       "}\n",
       ".btn-group > .btn + .dropdown-toggle:hover {\n",
       " border-left: 2px solid #ff7823 !important;\n",
       "}\n",
       ".input-group-btn {\n",
       " position: relative;\n",
       " font-size: inherit;\n",
       " white-space: nowrap;\n",
       "}\n",
       ".input-group-btn:first-child > .btn,\n",
       ".input-group-btn:first-child > .btn-group {\n",
       " background: #eeeeee;\n",
       " background-color: #eeeeee;\n",
       " border: 1px solid #ebebeb;\n",
       " margin: 2px;\n",
       " font-size: inherit;\n",
       "}\n",
       ".input-group-btn:first-child > .btn:hover,\n",
       ".input-group-btn:first-child > .btn-group:hover {\n",
       " background: #e9e9e9;\n",
       " background-color: #e9e9e9;\n",
       " border: 1px solid #e9e9e9;\n",
       " margin: 2px;\n",
       " font-size: inherit;\n",
       "}\n",
       "div.modal .btn-group > .btn:first-child {\n",
       " background: #eeeeee;\n",
       " background-color: #eeeeee;\n",
       " border: 1px solid #ebebeb;\n",
       " margin-top: 0px !important;\n",
       " margin-left: 0px;\n",
       " margin-bottom: 2px;\n",
       "}\n",
       "div.modal .btn-group > .btn:first-child:hover {\n",
       " background: #e9e9e9;\n",
       " background-color: #e9e9e9;\n",
       " border: 1px solid #e9e9e9;\n",
       "}\n",
       "div.modal > button,\n",
       "div.modal-footer > button {\n",
       " background: #eeeeee;\n",
       " background-color: #eeeeee;\n",
       " border-color: #eeeeee;\n",
       "}\n",
       "div.modal > button:hover,\n",
       "div.modal-footer > button:hover {\n",
       " background: #e9e9e9;\n",
       " background-color: #e9e9e9;\n",
       " border-color: #e9e9e9;\n",
       "}\n",
       ".modal-content {\n",
       " font-family: \"Exo_2\", sans-serif;\n",
       " font-size: 12.0pt;\n",
       " position: relative;\n",
       " background: #eeeeee;\n",
       " background-color: #eeeeee;\n",
       " border: none;\n",
       " border-radius: 1px;\n",
       " background-clip: padding-box;\n",
       " outline: none;\n",
       "}\n",
       ".modal-header {\n",
       " font-family: \"Exo_2\", sans-serif;\n",
       " font-size: 13pt;\n",
       " color: #303030;\n",
       " background: #eeeeee;\n",
       " background-color: #eeeeee;\n",
       " border-color: rgba(180,180,180,.30);\n",
       " padding: 12px;\n",
       " min-height: 16.4286px;\n",
       "}\n",
       ".modal-content h4 {\n",
       " font-family: \"Exo_2\", sans-serif;\n",
       " font-size: 16pt;\n",
       " color: #303030;\n",
       " padding: 5px;\n",
       "}\n",
       ".modal-body {\n",
       " background-color: #ffffff;\n",
       " position: relative;\n",
       " padding: 15px;\n",
       "}\n",
       ".modal-footer {\n",
       " padding: 10px;\n",
       " text-align: right;\n",
       " background-color: #fafafa;\n",
       " border-top: 1px solid rgba(180,180,180,.30);\n",
       "}\n",
       ".alert-info {\n",
       " background-color: #fdfdfd;\n",
       " border-color: rgba(180,180,180,.30);\n",
       " color: #303030;\n",
       "}\n",
       ".modal-header .close {\n",
       " margin-top: -5px;\n",
       " font-size: 25pt;\n",
       "}\n",
       ".modal-backdrop,\n",
       ".modal-backdrop.in {\n",
       " opacity: 0.85;\n",
       " background-color: #d6d6d6;\n",
       "}\n",
       "div.panel,\n",
       "div.panel-default,\n",
       ".panel,\n",
       ".panel-default {\n",
       " font-family: \"Exo_2\", sans-serif;\n",
       " font-size: 12.0pt;\n",
       " background-color: #fafafa;\n",
       " color: #303030;\n",
       " margin-bottom: 14px;\n",
       " border: 0;\n",
       " box-shadow: none;\n",
       "}\n",
       "div.panel > .panel-heading,\n",
       "div.panel-default > .panel-heading {\n",
       " font-size: 14pt;\n",
       " color: #303030;\n",
       " background: #eeeeee;\n",
       " background-color: #eeeeee;\n",
       " border: 0;\n",
       "}\n",
       ".modal .modal-dialog {\n",
       " min-width: 950px;\n",
       " margin: 50px auto;\n",
       "}\n",
       "div.container-fluid {\n",
       " margin-right: auto;\n",
       " margin-left: auto;\n",
       " padding-left: 7px;\n",
       " padding-right: 12px;\n",
       "}\n",
       "div.form-control,\n",
       ".form-control {\n",
       " font-family: \"Exo_2\", sans-serif;\n",
       " font-size: inherit;\n",
       " color: #303030;\n",
       " background-color: #ffffff;\n",
       " border: 2px solid #e7e7e7;\n",
       " margin-left: 2px;\n",
       " height: auto;\n",
       " box-shadow: none;\n",
       " padding: 6px 12px;\n",
       " transition: border-color 0.15s ease-in-out 0s, box-shadow 0.15s ease-in-out 0s;\n",
       "}\n",
       ".form-group.list-group-item {\n",
       " color: #303030;\n",
       " background-color: #fafafa;\n",
       " border-color: rgba(180,180,180,.30);\n",
       " margin-bottom: 0px;\n",
       "}\n",
       "input,\n",
       "button,\n",
       "select,\n",
       "textarea {\n",
       " background-color: #ffffff;\n",
       " font-weight: normal;\n",
       " border: 1px solid rgba(180,180,180,.30);\n",
       "}\n",
       "select.form-control.select-xs {\n",
       " height: auto;\n",
       "}\n",
       "div.output.output_scroll {\n",
       " box-shadow: none;\n",
       "}\n",
       "::-webkit-scrollbar-track {\n",
       " -webkit-box-shadow: inset 0 0 6px rgba(0,0,0,0.11);\n",
       " background-color: #d0d0d0;\n",
       " border-radius: 6px;\n",
       "}\n",
       "::-webkit-scrollbar {\n",
       " width: 14px;\n",
       " height: 20px;\n",
       " background-color: #d0d0d0;\n",
       " border-radius: 6px;\n",
       "}\n",
       "::-webkit-scrollbar-thumb {\n",
       " background-color: #ffffff;\n",
       " background-image: -webkit-gradient(linear,40% 0%,75% 86%,from(#ff6b0f ),color-stop(0.5,#ff8b42 ),to(#ff6b0f ));\n",
       " min-height: 100px;\n",
       " border-radius: 2px;\n",
       "}\n",
       "div.input_area {\n",
       " background-color: #efefef;\n",
       " padding-right: 1.2em;\n",
       " border: 0px;\n",
       " border-top-left-radius: 0px;\n",
       " border-top-right-radius: 2px;\n",
       " border-bottom-left-radius: 0px;\n",
       " border-bottom-right-radius: 0px;\n",
       "}\n",
       "div.cell {\n",
       " padding: 0px;\n",
       " background: #efefef;\n",
       " background-color: #efefef;\n",
       " border: medium solid #ffffff;\n",
       " border-top-right-radius: 2px;\n",
       " border-top-left-radius: 2px;\n",
       "}\n",
       "div.cell.selected {\n",
       " background: #efefef;\n",
       " background-color: #efefef;\n",
       " border: medium solid #ff7823;\n",
       " padding: 0px;\n",
       " border-top-right-radius: 2px;\n",
       " border-top-left-radius: 2px;\n",
       "}\n",
       ".edit_mode div.cell.selected {\n",
       " padding: 0px;\n",
       " background: #efefef;\n",
       " background-color: #efefef;\n",
       " border: medium solid #ffd5bb;\n",
       " border-top-right-radius: 2px;\n",
       " border-top-left-radius: 2px;\n",
       "}\n",
       "div.cell.edit_mode {\n",
       " padding: 0px;\n",
       " background: #efefef;\n",
       " background-color: #efefef;\n",
       " border: medium solid #ffd5bb;\n",
       " border-top-right-radius: 2px;\n",
       " border-top-left-radius: 2px;\n",
       "}\n",
       "div.prompt,\n",
       ".prompt {\n",
       " font-family: \"Fira Mono\", monospace;\n",
       " font-size: 9.5pt;\n",
       " font-weight: normal;\n",
       " color: #aaaaaa;\n",
       " line-height: 170%;\n",
       " padding: 0px;\n",
       " padding-top: 4px;\n",
       " padding-left: .25em;\n",
       " text-align: left !important;\n",
       " min-width: 12ex;\n",
       " width: 12ex;\n",
       "}\n",
       "div.prompt.input_prompt {\n",
       " background-color: #efefef;\n",
       " border-right: 2px solid rgba(240,147,43,.50);\n",
       " border-top-left-radius: 2px;\n",
       " border-top-right-radius: 0px;\n",
       " border-bottom-left-radius: 0px;\n",
       " border-bottom-right-radius: 0px;\n",
       " min-width: 12ex;\n",
       " width: 12ex !important;\n",
       "}\n",
       "div.output_wrapper {\n",
       " background-color: #ffffff;\n",
       " border: 0px;\n",
       " margin-bottom: 0em;\n",
       " margin-top: 0em;\n",
       " border-top-right-radius: 0px;\n",
       " border-top-left-radius: 0px;\n",
       " border-bottom-left-radius: 2px;\n",
       " border-bottom-right-radius: 2px;\n",
       "}\n",
       "div.output_subarea.output_text.output_stream.output_stdout,\n",
       "div.output_subarea.output_text {\n",
       " font-family: \"Droid Sans Mono\", monospace;\n",
       " font-size: 10.0pt;\n",
       " line-height: 150% !important;\n",
       " background-color: #ffffff;\n",
       " color: #303030;\n",
       " border-top-right-radius: 0px;\n",
       " border-top-left-radius: 0px;\n",
       " border-bottom-left-radius: 2px;\n",
       " border-bottom-right-radius: 2px;\n",
       "}\n",
       "div.output_area pre {\n",
       " font-family: \"Droid Sans Mono\", monospace;\n",
       " font-size: 10.0pt;\n",
       " line-height: 150% !important;\n",
       " color: #303030;\n",
       " border-top-right-radius: 0px;\n",
       " border-top-left-radius: 0px;\n",
       " border-bottom-left-radius: 2px;\n",
       " border-bottom-right-radius: 2px;\n",
       "}\n",
       "div.output_area {\n",
       " display: -webkit-box;\n",
       "}\n",
       "div.output_html {\n",
       " font-family: \"Droid Sans Mono\", monospace;\n",
       " font-size: 10.0pt;\n",
       " color: #353535;\n",
       " background-color: #ffffff;\n",
       " background: #ffffff;\n",
       "}\n",
       "div.output_subarea {\n",
       " overflow-x: auto;\n",
       " padding: .8em;\n",
       " -webkit-box-flex: 1;\n",
       " -moz-box-flex: 1;\n",
       " box-flex: 1;\n",
       " flex: 1;\n",
       " max-width: 90%;\n",
       "}\n",
       "div.prompt.output_prompt {\n",
       " font-family: \"Fira Mono\", monospace;\n",
       " font-size: 9.5pt;\n",
       " background-color: #ffffff;\n",
       " color: #ffffff;\n",
       " border-bottom-left-radius: 2px;\n",
       " border-top-right-radius: 0px;\n",
       " border-top-left-radius: 0px;\n",
       " border-bottom-right-radius: 0px;\n",
       " min-width: 12ex;\n",
       " width: 12ex;\n",
       "}\n",
       "div.out_prompt_overlay.prompt {\n",
       " font-family: \"Fira Mono\", monospace;\n",
       " font-size: 9.5pt;\n",
       " background-color: #ffffff;\n",
       " border-bottom-left-radius: 2px;\n",
       " border-top-right-radius: 0px;\n",
       " border-top-left-radius: 0px;\n",
       " border-bottom-right-radius: 0px;\n",
       " min-width: 12ex;\n",
       " width: 12ex;\n",
       "}\n",
       "div.out_prompt_overlay.prompt:hover {\n",
       " background-color: #ffffff;\n",
       " box-shadow: #e8e8e8 2px 1px 2px 2.5px inset;\n",
       " border-bottom-left-radius: 2px;\n",
       " -webkit-border-: 2px;\n",
       " -moz-border-radius: 2px;\n",
       " border-top-right-radius: 0px;\n",
       " border-top-left-radius: 0px;\n",
       " min-width: 12ex;\n",
       " width: 12ex !important;\n",
       "}\n",
       "div.text_cell,\n",
       "div.text_cell_render pre,\n",
       "div.text_cell_render {\n",
       " font-family: \"Lora\", serif;\n",
       " font-size: 20pt;\n",
       " line-height: 170% !important;\n",
       " color: #353535;\n",
       " background: #ffffff;\n",
       " background-color: #ffffff;\n",
       " border-radius: 2px;\n",
       " min-height: 500px;\n",
       "}\n",
       "div.cell.text_cell.rendered.selected {\n",
       " font-family: \"Lora\", serif;\n",
       " border: medium solid #126dce;\n",
       " line-height: 170% !important;\n",
       " background: #ffffff;\n",
       " background-color: #ffffff;\n",
       " border-radius: 2px;\n",
       " \n",
       "}\n",
       "div.cell.text_cell.unrendered.selected {\n",
       " font-family: \"Lora\", serif;\n",
       " line-height: 170% !important;\n",
       " background: #ffffff;\n",
       " background-color: #ffffff;\n",
       " border: medium solid #126dce;\n",
       " border-radius: 2px;\n",
       "}\n",
       "div.cell.text_cell.selected {\n",
       " font-family: \"Lora\", serif;\n",
       " line-height: 170% !important;\n",
       " border: medium solid #126dce;\n",
       " background: #ffffff;\n",
       " background-color: #ffffff;\n",
       " border-radius: 2px;\n",
       "}\n",
       ".edit_mode div.cell.text_cell.selected {\n",
       " font-family: \"Lora\", serif;\n",
       " line-height: 170% !important;\n",
       " background: #ffffff;\n",
       " background-color: #ffffff;\n",
       " border: medium solid #87b0db;\n",
       " border-radius: 2px;\n",
       "}\n",
       "div.text_cell.unrendered,\n",
       "div.text_cell.unrendered.selected,\n",
       "div.edit_mode div.text_cell.unrendered {\n",
       " font-family: \"Lora\", serif;\n",
       " line-height: 170% !important;\n",
       " background: #ffffff;\n",
       " background-color: #ffffff;\n",
       " border-radius: 2px;\n",
       "}\n",
       "div.cell.text_cell.rendered .input_prompt {\n",
       " font-family: \"Fira Mono\", monospace;\n",
       " font-size: 9.5pt;\n",
       " font-weight: normal;\n",
       " color: #aaaaaa;\n",
       " text-align: left !important;\n",
       " min-width: 0ex;\n",
       " width: 0ex !important;\n",
       " background-color: #ffffff;\n",
       " border-right: 2px solid transparent;\n",
       "}\n",
       "div.cell.text_cell.unrendered .input_prompt {\n",
       " font-family: \"Fira Mono\", monospace;\n",
       " font-size: 9.5pt;\n",
       " font-weight: normal;\n",
       " color: #aaaaaa;\n",
       " text-align: left !important;\n",
       " min-width: 0ex;\n",
       " width: 0ex !important;\n",
       " border-right: 2px solid transparent;\n",
       "}\n",
       "div.rendered_html code {\n",
       " font-family: \"Droid Sans Mono\", monospace;\n",
       " font-size: 11pt;\n",
       " padding-top: 3px;\n",
       " color: #303030;\n",
       " background: #efefef;\n",
       " background-color: #efefef;\n",
       "}\n",
       "pre,\n",
       "code,\n",
       "kbd,\n",
       "samp {\n",
       " white-space: pre-wrap;\n",
       "}\n",
       "code {\n",
       " font-family: \"Droid Sans Mono\", monospace;\n",
       " font-size: 11pt !important;\n",
       " line-height: 170% !important;\n",
       " color: #353535;\n",
       " background: #efefef;\n",
       " background-color: #efefef;\n",
       "}\n",
       "kbd {\n",
       " padding: 4px;\n",
       " font-size: 11pt;\n",
       " color: #303030;\n",
       " background-color: #efefef;\n",
       " border: 0;\n",
       " box-shadow: none;\n",
       "}\n",
       "pre {\n",
       " display: block;\n",
       " padding: 8.5px;\n",
       " margin: 0 0 9px;\n",
       " font-size: 12.0pt;\n",
       " line-height: 1.42857143;\n",
       " color: #303030;\n",
       " background-color: #efefef;\n",
       " border: 1px solid #e7e7e7;\n",
       " border-radius: 2px;\n",
       "}\n",
       "div.rendered_html {\n",
       " color: #353535;\n",
       "}\n",
       "div.rendered_html pre,\n",
       "div.text_cell_render pre {\n",
       " font-family: \"Droid Sans Mono\", monospace;\n",
       " font-size: 11pt !important;\n",
       " line-height: 170% !important;\n",
       " color: #353535;\n",
       " background: #efefef;\n",
       " background-color: #efefef;\n",
       " border: 2px #e7e7e7 solid;\n",
       " max-width: 86%;\n",
       " border-radius: 2px;\n",
       " padding: 5px;\n",
       " min-height: 1px;\n",
       "}\n",
       "div.text_cell_render h1,\n",
       "div.rendered_html h1,\n",
       "div.text_cell_render h2,\n",
       "div.rendered_html h2,\n",
       "div.text_cell_render h3,\n",
       "div.rendered_html h3,\n",
       "div.text_cell_render h4,\n",
       "div.rendered_html h4,\n",
       "div.text_cell_render h5,\n",
       "div.rendered_html h5 {\n",
       " font-family: \"Exo_2\", sans-serif;\n",
       "}\n",
       ".rendered_html h1:first-child,\n",
       ".rendered_html h2:first-child,\n",
       ".rendered_html h3:first-child,\n",
       ".rendered_html h4:first-child,\n",
       ".rendered_html h5:first-child,\n",
       ".rendered_html h6:first-child {\n",
       " margin-top: 0.2em;\n",
       "}\n",
       ".rendered_html h1,\n",
       ".text_cell_render h1 {\n",
       " color: #126dce;\n",
       " font-size: 220%;\n",
       " text-align: center;\n",
       " font-weight: lighter;\n",
       "}\n",
       ".rendered_html h2,\n",
       ".text_cell_render h2 {\n",
       " text-align: left;\n",
       " font-size: 170%;\n",
       " color: #126dce;\n",
       " font-style: normal;\n",
       " font-weight: lighter;\n",
       "}\n",
       ".rendered_html h3,\n",
       ".text_cell_render h3 {\n",
       " font-size: 150%;\n",
       " color: #126dce;\n",
       " font-weight: lighter;\n",
       " text-decoration: italic;\n",
       " font-style: normal;\n",
       "}\n",
       ".rendered_html h4,\n",
       ".text_cell_render h4 {\n",
       " font-size: 120%;\n",
       " color: #126dce;\n",
       " font-weight: underline;\n",
       " font-style: normal;\n",
       "}\n",
       ".rendered_html h5,\n",
       ".text_cell_render h5 {\n",
       " font-size: 100%;\n",
       " color: #2f2f2f;\n",
       " font-weight: lighter;\n",
       " text-decoration: underline;\n",
       "}\n",
       ".rendered_html table,\n",
       ".rendered_html tr,\n",
       ".rendered_html td {\n",
       " font-family: \"Fira Mono\", monospace;\n",
       " font-size: 10.0pt !important;\n",
       " line-height: 150% !important;\n",
       " border: 1px solid #d6d6d6;\n",
       " color: #353535;\n",
       " background-color: #ffffff;\n",
       " background: #ffffff;\n",
       "}\n",
       "table.dataframe,\n",
       ".rendered_html tr,\n",
       ".dataframe * {\n",
       " font-family: \"Fira Mono\", monospace;\n",
       " font-size: 10.0pt !important;\n",
       " border: 1px solid #d6d6d6;\n",
       "}\n",
       ".dataframe th,\n",
       ".rendered_html th {\n",
       " font-family: \"Exo_2\", sans-serif;\n",
       " font-size: 11pt !important;\n",
       " font-weight: bold;\n",
       " border: 1px solid #c4c4c4;\n",
       " background: #eeeeee;\n",
       "}\n",
       ".dataframe td,\n",
       ".rendered_html td {\n",
       " font-family: \"Fira Mono\", monospace;\n",
       " font-size: 10.0pt !important;\n",
       " color: #353535;\n",
       " background: #ffffff;\n",
       " border: 1px solid #d6d6d6;\n",
       " text-align: left;\n",
       " min-width: 4em;\n",
       "}\n",
       ".dataframe-summary-row tr:last-child,\n",
       ".dataframe-summary-col td:last-child {\n",
       " font-family: \"Exo_2\", sans-serif;\n",
       " font-size: 11pt !important;\n",
       " font-weight: bold;\n",
       " color: #353535;\n",
       " border: 1px solid #d6d6d6;\n",
       " background: #eeeeee;\n",
       "}\n",
       "div.widget-area {\n",
       " background-color: #ffffff;\n",
       " background: #ffffff;\n",
       " color: #303030;\n",
       "}\n",
       "div.widget-area a {\n",
       " font-family: \"Exo_2\", sans-serif;\n",
       " font-size: 12.0pt;\n",
       " font-weight: normal;\n",
       " font-style: normal;\n",
       " color: #303030;\n",
       " text-shadow: none !important;\n",
       "}\n",
       "div.widget-area a:hover,\n",
       "div.widget-area a:focus {\n",
       " font-family: \"Exo_2\", sans-serif;\n",
       " font-size: 12.0pt;\n",
       " font-weight: normal;\n",
       " font-style: normal;\n",
       " color: #2f2f2f;\n",
       " background: rgba(180,180,180,.14);\n",
       " background-color: rgba(180,180,180,.14);\n",
       " border-color: transparent;\n",
       " background-image: none;\n",
       " text-shadow: none !important;\n",
       "}\n",
       "div.widget_item.btn-group > button.btn.btn-default.widget-combo-btn,\n",
       "div.widget_item.btn-group > button.btn.btn-default.widget-combo-btn:hover {\n",
       " background: #eeeeee;\n",
       " background-color: #eeeeee;\n",
       " border: 2px solid #eeeeee !important;\n",
       " font-size: inherit;\n",
       " z-index: 0;\n",
       "}\n",
       "div.jupyter-widgets.widget-hprogress.widget-hbox,\n",
       "div.widget-hbox,\n",
       ".widget-hbox {\n",
       " display: inline-table;\n",
       "}\n",
       "div.jupyter-widgets.widget-hprogress.widget-hbox .widget-label,\n",
       "div.widget-hbox .widget-label,\n",
       ".widget-hbox .widget-label {\n",
       " font-size: 11pt;\n",
       " min-width: 100%;\n",
       " padding-top: 5px;\n",
       " padding-right: 10px;\n",
       " text-align: left;\n",
       " vertical-align: text-top;\n",
       "}\n",
       ".progress {\n",
       " overflow: hidden;\n",
       " height: 20px;\n",
       " margin-bottom: 10px;\n",
       " padding-left: 10px;\n",
       " background-color: #c6c6c6;\n",
       " border-radius: 4px;\n",
       " -webkit-box-shadow: none;\n",
       " box-shadow: none;\n",
       "}\n",
       ".rendered_html :link {\n",
       " font-family: \"Exo_2\", sans-serif;\n",
       " font-size: 100%;\n",
       " color: #2c85f7;\n",
       " text-decoration: underline;\n",
       "}\n",
       ".rendered_html :visited,\n",
       ".rendered_html :visited:active,\n",
       ".rendered_html :visited:focus {\n",
       " color: #2e6eb2;\n",
       "}\n",
       ".rendered_html :visited:hover,\n",
       ".rendered_html :link:hover {\n",
       " font-family: \"Exo_2\", sans-serif;\n",
       " font-size: 100%;\n",
       " color: #eb6a18;\n",
       "}\n",
       "a.anchor-link:link:hover {\n",
       " font-size: inherit;\n",
       " color: #eb6a18;\n",
       "}\n",
       "a.anchor-link:link {\n",
       " font-size: inherit;\n",
       " text-decoration: none;\n",
       " padding: 0px 20px;\n",
       " visibility: none;\n",
       " color: #126dce;\n",
       "}\n",
       ".navbar-text {\n",
       " margin-top: 4px;\n",
       " margin-bottom: 0px;\n",
       "}\n",
       "div#nbextensions-configurator-container.container,\n",
       "#nbextensions-configurator-container.container {\n",
       " width: 100%;\n",
       " margin-right: auto;\n",
       " margin-left: auto;\n",
       "}\n",
       "div.nbext-selector > nav > .nav > li > a {\n",
       " font-family: \"Exo_2\", sans-serif;\n",
       " font-size: 12pt;\n",
       "}\n",
       "div.nbext-readme > .nbext-readme-contents > .rendered_html {\n",
       " font-family: \"Exo_2\", sans-serif;\n",
       " font-size: 12pt;\n",
       " line-height: 145%;\n",
       " padding: 1em 1em;\n",
       " color: #353535;\n",
       " background-color: #ffffff;\n",
       " -webkit-box-shadow: none;\n",
       " -moz-box-shadow: none;\n",
       " box-shadow: none;\n",
       "}\n",
       ".nbext-icon,\n",
       ".nbext-desc,\n",
       ".nbext-compat-div,\n",
       ".nbext-enable-btns,\n",
       ".nbext-params {\n",
       " margin-bottom: 8px;\n",
       " font-size: 12pt;\n",
       "}\n",
       "div.nbext-readme > .nbext-readme-contents {\n",
       " padding: 0;\n",
       " overflow-y: hidden;\n",
       "}\n",
       "div.nbext-readme > .nbext-readme-contents:not(:empty) {\n",
       " margin-top: 0.5em;\n",
       " margin-bottom: 2em;\n",
       " border: none;\n",
       " border-top-color: rgba(180,180,180,.30);\n",
       "}\n",
       ".nbext-showhide-incompat {\n",
       " padding-bottom: 0.5em;\n",
       " color: #4a4a4a;\n",
       " font-size: 12.0pt;\n",
       "}\n",
       ".shortcut_key,\n",
       "span.shortcut_key {\n",
       " display: inline-block;\n",
       " width: 16ex;\n",
       " text-align: right;\n",
       " font-family: monospace;\n",
       "}\n",
       "mark,\n",
       ".mark {\n",
       " background-color: #ffffff;\n",
       " color: #353535;\n",
       " padding: .15em;\n",
       "}\n",
       "a.text-warning,\n",
       "a.text-warning:hover {\n",
       " color: #aaaaaa;\n",
       "}\n",
       "a.text-warning.bg-warning {\n",
       " background-color: #ffffff;\n",
       "}\n",
       "span.bg-success.text-success {\n",
       " background-color: transparent;\n",
       " color: #009e07;\n",
       "}\n",
       "span.bg-danger.text-danger {\n",
       " background-color: #ffffff;\n",
       " color: #de143d;\n",
       "}\n",
       ".has-success .input-group-addon {\n",
       " color: #009e07;\n",
       " border-color: transparent;\n",
       " background: inherit;\n",
       " background-color: rgba(83,180,115,.10);\n",
       "}\n",
       ".has-success .form-control {\n",
       " border-color: #009e07;\n",
       " -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,0.025);\n",
       " box-shadow: inset 0 1px 1px rgba(0,0,0,0.025);\n",
       "}\n",
       ".has-error .input-group-addon {\n",
       " color: #de143d;\n",
       " border-color: transparent;\n",
       " background: inherit;\n",
       " background-color: rgba(192,57,67,.10);\n",
       "}\n",
       ".has-error .form-control {\n",
       " border-color: #de143d;\n",
       " -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,0.025);\n",
       " box-shadow: inset 0 1px 1px rgba(0,0,0,0.025);\n",
       "}\n",
       ".kse-input-group-pretty > kbd {\n",
       " font-family: \"Droid Sans Mono\", monospace;\n",
       " color: #303030;\n",
       " font-weight: normal;\n",
       " background: transparent;\n",
       "}\n",
       ".kse-input-group-pretty > kbd {\n",
       " font-family: \"Droid Sans Mono\", monospace;\n",
       " color: #303030;\n",
       " font-weight: normal;\n",
       " background: transparent;\n",
       "}\n",
       "div.nbext-enable-btns .btn[disabled],\n",
       "div.nbext-enable-btns .btn[disabled]:hover,\n",
       ".btn-default.disabled,\n",
       ".btn-default[disabled] {\n",
       " background: #e8e8e8;\n",
       " background-color: #e8e8e8;\n",
       " color: #282828;\n",
       "}\n",
       "label#Keyword-Filter {\n",
       " display: none;\n",
       "}\n",
       ".nav-pills > li.active > a,\n",
       ".nav-pills > li.active > a:hover,\n",
       ".nav-pills > li.active > a:focus {\n",
       " color: #ffffff;\n",
       " background-color: #126dce;\n",
       "}\n",
       ".input-group .nbext-list-btn-add,\n",
       ".input-group-btn:last-child > .btn-group > .btn {\n",
       " background: #eeeeee;\n",
       " background-color: #eeeeee;\n",
       " border-color: #eeeeee;\n",
       "}\n",
       ".input-group .nbext-list-btn-add:hover,\n",
       ".input-group-btn:last-child > .btn-group > .btn:hover {\n",
       " background: #e9e9e9;\n",
       " background-color: #e9e9e9;\n",
       " border-color: #e9e9e9;\n",
       "}\n",
       "#notebook-container > div.cell.code_cell.rendered.selected > div.widget-area > div.widget-subarea > div > div.widget_item.btn-group > button.btn.btn-default.dropdown-toggle.widget-combo-carrot-btn {\n",
       " background: #eeeeee;\n",
       " background-color: #eeeeee;\n",
       " border-color: #eeeeee;\n",
       "}\n",
       "#notebook-container > div.cell.code_cell.rendered.selected > div.widget-area > div.widget-subarea > div > div.widget_item.btn-group > button.btn.btn-default.dropdown-toggle.widget-combo-carrot-btn:hover {\n",
       " background: #e9e9e9;\n",
       " background-color: #e9e9e9;\n",
       " border-color: #e9e9e9;\n",
       "}\n",
       "input.raw_input {\n",
       " font-family: \"Droid Sans Mono\", monospace;\n",
       " font-size: 11pt !important;\n",
       " color: #303030;\n",
       " background-color: #efefef;\n",
       " border-color: #ececec;\n",
       " background: #ececec;\n",
       " width: auto;\n",
       " vertical-align: baseline;\n",
       " padding: 0em 0.25em;\n",
       " margin: 0em 0.25em;\n",
       " -webkit-box-shadow: none;\n",
       " box-shadow: none;\n",
       "}\n",
       "audio,\n",
       "video {\n",
       " display: inline;\n",
       " vertical-align: middle;\n",
       " align-content: center;\n",
       " margin-left: 20%;\n",
       "}\n",
       ".cmd-palette .modal-body {\n",
       " padding: 0px;\n",
       " margin: 0px;\n",
       "}\n",
       ".cmd-palette form {\n",
       " background: #eeeeee;\n",
       " background-color: #eeeeee;\n",
       "}\n",
       ".typeahead-field input:last-child,\n",
       ".typeahead-hint {\n",
       " background: #eeeeee;\n",
       " background-color: #eeeeee;\n",
       " z-index: 1;\n",
       "}\n",
       ".typeahead-field input {\n",
       " font-family: \"Exo_2\", sans-serif;\n",
       " color: #303030;\n",
       " border: none;\n",
       " font-size: 28pt;\n",
       " display: inline-block;\n",
       " line-height: inherit;\n",
       " padding: 3px 10px;\n",
       " height: 70px;\n",
       "}\n",
       ".typeahead-select {\n",
       " background-color: #eeeeee;\n",
       "}\n",
       "body > div.modal.cmd-palette.typeahead-field {\n",
       " display: table;\n",
       " border-collapse: separate;\n",
       " background-color: #fafafa;\n",
       "}\n",
       ".typeahead-container button {\n",
       " font-family: \"Exo_2\", sans-serif;\n",
       " font-size: 28pt;\n",
       " background-color: #d0d0d0;\n",
       " border: none;\n",
       " display: inline-block;\n",
       " line-height: inherit;\n",
       " padding: 3px 10px;\n",
       " height: 70px;\n",
       "}\n",
       ".typeahead-search-icon {\n",
       " min-width: 40px;\n",
       " min-height: 55px;\n",
       " display: block;\n",
       " vertical-align: middle;\n",
       " text-align: center;\n",
       "}\n",
       ".typeahead-container button:focus,\n",
       ".typeahead-container button:hover {\n",
       " color: #2f2f2f;\n",
       " background-color: #ff7823;\n",
       " border-color: #ff7823;\n",
       "}\n",
       ".typeahead-list > li.typeahead-group.active > a,\n",
       ".typeahead-list > li.typeahead-group > a,\n",
       ".typeahead-list > li.typeahead-group > a:focus,\n",
       ".typeahead-list > li.typeahead-group > a:hover {\n",
       " display: none;\n",
       "}\n",
       ".typeahead-dropdown > li > a,\n",
       ".typeahead-list > li > a {\n",
       " color: #303030;\n",
       " text-decoration: none;\n",
       "}\n",
       ".typeahead-dropdown,\n",
       ".typeahead-list {\n",
       " font-family: \"Exo_2\", sans-serif;\n",
       " font-size: 13pt;\n",
       " color: #303030;\n",
       " background-color: #ffffff;\n",
       " border: none;\n",
       " background-clip: padding-box;\n",
       " margin-top: 0px;\n",
       " padding: 3px 2px 3px 0px;\n",
       " line-height: 1.7;\n",
       "}\n",
       ".typeahead-dropdown > li.active > a,\n",
       ".typeahead-dropdown > li > a:focus,\n",
       ".typeahead-dropdown > li > a:hover,\n",
       ".typeahead-list > li.active > a,\n",
       ".typeahead-list > li > a:focus,\n",
       ".typeahead-list > li > a:hover {\n",
       " color: #2f2f2f;\n",
       " background-color: #fafafa;\n",
       " border-color: #fafafa;\n",
       "}\n",
       ".command-shortcut:before {\n",
       " content: \"(command)\";\n",
       " padding-right: 3px;\n",
       " color: #aaaaaa;\n",
       "}\n",
       ".edit-shortcut:before {\n",
       " content: \"(edit)\";\n",
       " padding-right: 3px;\n",
       " color: #aaaaaa;\n",
       "}\n",
       "ul.typeahead-list i {\n",
       " margin-left: 1px;\n",
       " width: 18px;\n",
       " margin-right: 10px;\n",
       "}\n",
       "ul.typeahead-list {\n",
       " max-height: 50vh;\n",
       " overflow: auto;\n",
       "}\n",
       ".typeahead-list > li {\n",
       " position: relative;\n",
       " border: none;\n",
       "}\n",
       "div.input.typeahead-hint,\n",
       "input.typeahead-hint,\n",
       "body > div.modal.cmd-palette.in > div > div > div > form > div > div.typeahead-field > span.typeahead-query > input.typeahead-hint {\n",
       " color: #aaaaaa !important;\n",
       " background-color: transparent;\n",
       " padding: 3px 10px;\n",
       "}\n",
       ".typeahead-dropdown > li > a,\n",
       ".typeahead-list > li > a {\n",
       " display: block;\n",
       " padding: 5px;\n",
       " clear: both;\n",
       " font-weight: 400;\n",
       " line-height: 1.7;\n",
       " border: 1px solid #ffffff;\n",
       " border-bottom-color: rgba(180,180,180,.30);\n",
       "}\n",
       "body > div.modal.cmd-palette.in > div {\n",
       " min-width: 750px;\n",
       " margin: 150px auto;\n",
       "}\n",
       ".typeahead-container strong {\n",
       " font-weight: bolder;\n",
       " color: #ff7823;\n",
       "}\n",
       "#find-and-replace #replace-preview .match,\n",
       "#find-and-replace #replace-preview .insert {\n",
       " color: #ffffff;\n",
       " background-color: #ff7823;\n",
       " border-color: #ff7823;\n",
       " border-style: solid;\n",
       " border-width: 1px;\n",
       " border-radius: 0px;\n",
       "}\n",
       "#find-and-replace #replace-preview .replace .match {\n",
       " background-color: #de143d;\n",
       " border-color: #de143d;\n",
       " border-radius: 0px;\n",
       "}\n",
       "#find-and-replace #replace-preview .replace .insert {\n",
       " background-color: #009e07;\n",
       " border-color: #009e07;\n",
       " border-radius: 0px;\n",
       "}\n",
       "div.CodeMirror,\n",
       "div.CodeMirror pre {\n",
       " font-family: \"Droid Sans Mono\", monospace;\n",
       " font-size: 11pt;\n",
       " line-height: 170%;\n",
       " color: #303030;\n",
       "}\n",
       "div.CodeMirror-lines {\n",
       " padding-bottom: .6em;\n",
       " padding-left: .5em;\n",
       " padding-right: 1.5em;\n",
       " padding-top: 4px;\n",
       "}\n",
       "span.ansiblack {\n",
       " color: #dc4384;\n",
       "}\n",
       "span.ansiblue {\n",
       " color: #009e07;\n",
       "}\n",
       "span.ansigray {\n",
       " color: #ff7823;\n",
       "}\n",
       "span.ansigreen {\n",
       " color: #333333;\n",
       "}\n",
       "span.ansipurple {\n",
       " color: #653bc5;\n",
       "}\n",
       "span.ansicyan {\n",
       " color: #055be0;\n",
       "}\n",
       "span.ansiyellow {\n",
       " color: #ff7823;\n",
       "}\n",
       "span.ansired {\n",
       " color: #de143d;\n",
       "}\n",
       "div.output-stderr {\n",
       " background-color: #ebb5b7;\n",
       "}\n",
       "div.output-stderr pre {\n",
       " color: #000000;\n",
       "}\n",
       "div.js-error {\n",
       " color: #de143d;\n",
       "}\n",
       ".ipython_tooltip {\n",
       " font-family: \"Droid Sans Mono\", monospace;\n",
       " font-size: 11pt;\n",
       " line-height: 170%;\n",
       " border: 2px solid #dadada;\n",
       " background: #eeeeee;\n",
       " background-color: #eeeeee;\n",
       " border-radius: 2px;\n",
       " overflow-x: visible;\n",
       " overflow-y: visible;\n",
       " box-shadow: none;\n",
       " position: absolute;\n",
       " z-index: 1000;\n",
       "}\n",
       ".ipython_tooltip .tooltiptext pre {\n",
       " font-family: \"Droid Sans Mono\", monospace;\n",
       " font-size: 11pt;\n",
       " line-height: 170%;\n",
       " background: #eeeeee;\n",
       " background-color: #eeeeee;\n",
       " color: #303030;\n",
       " overflow-x: visible;\n",
       " overflow-y: visible;\n",
       " max-width: 900px;\n",
       "}\n",
       "div#tooltip.ipython_tooltip {\n",
       " overflow-x: wrap;\n",
       " overflow-y: visible;\n",
       " max-width: 800px;\n",
       "}\n",
       "div.tooltiptext.bigtooltip {\n",
       " overflow-x: visible;\n",
       " overflow-y: scroll;\n",
       " height: 400px;\n",
       " max-width: 800px;\n",
       "}\n",
       ".cm-s-ipython.CodeMirror {\n",
       " font-family: \"Droid Sans Mono\", monospace;\n",
       " font-size: 11pt;\n",
       " background: #efefef;\n",
       " color: #303030;\n",
       " border-radius: 2px;\n",
       " font-style: normal;\n",
       " font-weight: normal;\n",
       "}\n",
       ".cm-s-ipython div.CodeMirror-selected {\n",
       " background: #e0e1e3;\n",
       "}\n",
       ".cm-s-ipython .CodeMirror-gutters {\n",
       " background: #e0e1e3;\n",
       " border: none;\n",
       " border-radius: 0px;\n",
       "}\n",
       ".cm-s-ipython .CodeMirror-linenumber {\n",
       " color: #aaaaaa;\n",
       "}\n",
       ".cm-s-ipython .CodeMirror-cursor {\n",
       " border-left: 2px solid #ff711a;\n",
       "}\n",
       ".cm-s-ipython span.cm-comment {\n",
       " color: #8d8d8d;\n",
       " font-style: italic;\n",
       "}\n",
       ".cm-s-ipython span.cm-atom {\n",
       " color: #055be0;\n",
       "}\n",
       ".cm-s-ipython span.cm-number {\n",
       " color: #ff8132;\n",
       "}\n",
       ".cm-s-ipython span.cm-property {\n",
       " color: #e22978;\n",
       "}\n",
       ".cm-s-ipython span.cm-attribute {\n",
       " color: #de143d;\n",
       "}\n",
       ".cm-s-ipython span.cm-keyword {\n",
       " color: #713bc5;\n",
       " font-weight: normal;\n",
       "}\n",
       ".cm-s-ipython span.cm-string {\n",
       " color: #009e07;\n",
       "}\n",
       ".cm-s-ipython span.cm-meta {\n",
       " color: #aa22ff;\n",
       "}\n",
       ".cm-s-ipython span.cm-operator {\n",
       " color: #055be0;\n",
       "}\n",
       ".cm-s-ipython span.cm-builtin {\n",
       " color: #e22978;\n",
       "}\n",
       ".cm-s-ipython span.cm-variable {\n",
       " color: #303030;\n",
       "}\n",
       ".cm-s-ipython span.cm-variable-2 {\n",
       " color: #de143d;\n",
       "}\n",
       ".cm-s-ipython span.cm-variable-3 {\n",
       " color: #aa22ff;\n",
       "}\n",
       ".cm-s-ipython span.cm-def {\n",
       " color: #e22978;\n",
       " font-weight: normal;\n",
       "}\n",
       ".cm-s-ipython span.cm-error {\n",
       " background: rgba(191,97,106,.40);\n",
       "}\n",
       ".cm-s-ipython span.cm-tag {\n",
       " color: #e22978;\n",
       "}\n",
       ".cm-s-ipython span.cm-link {\n",
       " color: #ff7823;\n",
       "}\n",
       ".cm-s-ipython span.cm-storage {\n",
       " color: #055be0;\n",
       "}\n",
       ".cm-s-ipython span.cm-entity {\n",
       " color: #e22978;\n",
       "}\n",
       ".cm-s-ipython span.cm-quote {\n",
       " color: #009e07;\n",
       "}\n",
       "div.CodeMirror span.CodeMirror-matchingbracket {\n",
       " color: #1c1c1c;\n",
       " background-color: rgba(30,112,199,.30);\n",
       "}\n",
       "div.CodeMirror span.CodeMirror-nonmatchingbracket {\n",
       " color: #1c1c1c;\n",
       " background: rgba(191,97,106,.40) !important;\n",
       "}\n",
       "div.cell.text_cell .cm-s-default .cm-header {\n",
       " color: #126dce;\n",
       "}\n",
       "div.cell.text_cell .cm-s-default span.cm-variable-2 {\n",
       " color: #353535;\n",
       "}\n",
       "div.cell.text_cell .cm-s-default span.cm-variable-3 {\n",
       " color: #aa22ff;\n",
       "}\n",
       ".cm-s-default span.cm-comment {\n",
       " color: #8d8d8d;\n",
       "}\n",
       ".cm-s-default .cm-tag {\n",
       " color: #009fb7;\n",
       "}\n",
       ".cm-s-default .cm-builtin {\n",
       " color: #e22978;\n",
       "}\n",
       ".cm-s-default .cm-string {\n",
       " color: #009e07;\n",
       "}\n",
       ".cm-s-default .cm-keyword {\n",
       " color: #713bc5;\n",
       "}\n",
       ".cm-s-default .cm-number {\n",
       " color: #ff8132;\n",
       "}\n",
       ".cm-s-default .cm-error {\n",
       " color: #055be0;\n",
       "}\n",
       ".CodeMirror-cursor {\n",
       " border-left: 2px solid #ff711a;\n",
       " border-right: none;\n",
       " width: 0;\n",
       "}\n",
       ".cm-s-default div.CodeMirror-selected {\n",
       " background: #e0e1e3;\n",
       "}\n",
       ".cm-s-default .cm-selected {\n",
       " background: #e0e1e3;\n",
       "}\n",
       ".completions {\n",
       " position: absolute;\n",
       " z-index: 110;\n",
       " overflow: hidden;\n",
       " border: medium solid #ff7823;\n",
       " line-height: 1;\n",
       "}\n",
       ".completions select {\n",
       " background: #efefef;\n",
       " outline: none;\n",
       " border: none;\n",
       " padding: 0px;\n",
       " margin: 0px;\n",
       " overflow: auto;\n",
       " font-family: \"Droid Sans Mono\", monospace;\n",
       " font-size: 11pt;\n",
       " color: #303030;\n",
       " width: auto;\n",
       "}\n",
       "/**\n",
       "div#maintoolbar {\n",
       "# display: none !important;\n",
       "#}\n",
       "##header-container {\n",
       "# display: none !important;\n",
       "#}\n",
       "**/\n",
       "\n",
       "\n",
       "/**********************************\n",
       " MathJax Settings and Style Script\n",
       "**********************************/\n",
       ".MathJax_Display,\n",
       ".MathJax nobr>span.math>span {\n",
       "    border: 0 !important;\n",
       "    font-size: 110% !important;\n",
       "    text-align: center !important;\n",
       "    margin: 0em !important;\n",
       "}\n",
       "/* Prevents MathJax from jittering */\n",
       "/* cell position when cell is selected */\n",
       ".MathJax:focus, body :focus .MathJax {\n",
       "    display: inline-block !important;\n",
       "}\n",
       "\n",
       "</style>\n",
       "\n",
       "\n",
       "<script>\n",
       "    MathJax.Hub.Config({\n",
       "        \"HTML-CSS\": {\n",
       "            preferredFont: \"TeX\",\n",
       "            availableFonts: [\"STIX\",\"TeX\"],\n",
       "            styles: {\n",
       "                scale: 110,\n",
       "                \".MathJax_Display\": {\n",
       "                    \"font-size\": \"110%\",\n",
       "                }\n",
       "            }\n",
       "        }\n",
       "});\n",
       "\n",
       "$([IPython.events]).on('notebook_loaded.Notebook',function(){\n",
       "    $('#header').hide();\n",
       "    IPython.keyboard_manager.command_shortcuts.add_shortcut('ctrl-`',function (event) {\n",
       "        if (IPython.notebook.mode == 'command') {\n",
       "            $('#header').toggle();\n",
       "            return false;\n",
       "        }\n",
       "        return true;\n",
       "    });\n",
       "});\n",
       "\n",
       "</script>\n",
       "\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from IPython.core.display import HTML\n",
    "HTML(open('../custom.css').read())"
   ]
  }
 ],
 "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.7.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}