{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "nbpresent": {
     "id": "3ce13dbd-b25d-494c-a841-52b237d8240a"
    },
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# Motivation\n",
    "\n",
    "Multivariate linear regression before linear algebra:\n",
    "\n",
    "$$\n",
    "\\begin{align*}\n",
    "y^{(1)} &\\approx \\theta_0 + \\theta_1 x_1^{(1)} + \\theta_2 x_2^{(1)} + \\ldots + \\theta_n x_n^{(1)} \\\\ \n",
    "y^{(2)} &\\approx \\theta_0 + \\theta_1 x_1^{(2)} + \\theta_2 x_2^{(2)} + \\ldots + \\theta_n x_n^{(2)} \\\\ \n",
    "\\ldots \\\\\n",
    "y^{(m)} &\\approx \\theta_0 + \\theta_1 x_1^{(m)} + \\theta_2 x_2^{(m)} + \\ldots + \\theta_n x_n^{(m)}\n",
    "\\end{align*}\n",
    "$$\n",
    "\n",
    "Multivariate linear regression after linear algebra\n",
    "$$\n",
    "\\mathbf{y} \\approx X \\boldsymbol{\\theta}\n",
    "$$\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "nbpresent": {
     "id": "27119a93-4fda-404c-83bd-6e3386797809"
    },
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# Linear Algebra in ML\n",
    "\n",
    "* Succinct notation for models and algorithms\n",
    "* Numerical tools (save coding!)\n",
    "  $$\\boldsymbol{\\theta} = (X^{T}X)^{-1}X^T\\mathbf{y}$$\n",
    "* Inspiration for new models and problems: Netflix\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "nbpresent": {
     "id": "94e2833b-1345-49a7-85e2-004c324144ae"
    },
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# Netflix\n",
    "\n",
    "| user  | Moonlight | The Shape of Water   | Frozen | Moana     |\n",
    "|-------|-----------|----------------------|--------|-----------| \n",
    "|Alice  |   5       |          4           |    1   |           |\n",
    "|Bob    |           |          5           |        |    2      |\n",
    "|Carol  |           |                      |        |    5      |\n",
    "|David  |           |                      |    5   |    5      |\n",
    "|Eve    |   5       |          4           |        |           |\n",
    "\n",
    "\n",
    "Matrix completion problem, matrix factorization"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true,
    "nbpresent": {
     "id": "88982e7f-95ea-4222-ad68-0d7e43911762"
    },
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# Topics\n",
    "\n",
    "* Matrices\n",
    "* Vectors\n",
    "* Matrix-Matrix multiplication (and special cases)\n",
    "* Tranpose\n",
    "* Inverse"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "nbpresent": {
     "id": "aa0a3b44-b4ab-482c-a8cf-b58284779740"
    },
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# Matrices\n",
    "\n",
    "A matrix is an rectangular array of numbers\n",
    "\n",
    "$$\n",
    "A = \n",
    "\\left[\n",
    "\\begin{array}{cc}\n",
    "101 & 10 \\\\\n",
    "54  & 13 \\\\ \n",
    "10  & 47\n",
    "\\end{array}\n",
    "\\right]\n",
    "$$\n",
    "\n",
    "When $A$ has $m$ rows and $n$ columns, we say that: \n",
    "* $A$ is an $m \\times n$ matrix\n",
    "* $A \\in \\mathbb{R}^{m \\times n}$\n",
    "\n",
    "The entry in row $i$ and column $j$ is denoted $A_{ij}$\n",
    "* sometimes $a_{ij}$ or $(A)_{ij}$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "nbpresent": {
     "id": "f6ebe35f-72f3-4f6f-aaae-cd1cb51ef087"
    },
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# Example\n",
    "\n",
    "$$\n",
    "A = \n",
    "\\left[\n",
    "\\begin{array}{cc}\n",
    "101 & 10 \\\\\n",
    "54  & 13 \\\\ \n",
    "10  & 47\n",
    "\\end{array}\n",
    "\\right]\n",
    "$$\n",
    "\n",
    "* $A \\in \\mathbb{R}^{3 \\times 2}$\n",
    "* $A_{11}= 101$\n",
    "* $A_{32}=$ \n",
    "* $A_{22}=$\n",
    "* $A_{23}=$\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "nbpresent": {
     "id": "d5d9c223-d434-40c0-b30d-17fe548f9f21"
    },
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# Matrices in Python"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "nbpresent": {
     "id": "0bcd3d94-8e18-4bd3-8598-178ae406db64"
    },
    "scrolled": true,
    "slideshow": {
     "slide_type": "-"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[101  10]\n",
      " [ 54  13]\n",
      " [ 10  47]]\n",
      "A has 3 rows and 2 columns\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "\n",
    "# Pass a list of lists (rows) to the np.array constructor\n",
    "A = np.array([[101, 10], \n",
    "             [54,  13], \n",
    "             [10,  47]])\n",
    "\n",
    "print(A)\n",
    "\n",
    "m,n = A.shape\n",
    "\n",
    "print (\"A has %d rows and %d columns\" % (m, n))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "nbpresent": {
     "id": "45eef18f-3497-4513-98ed-f31ab0c8d828"
    },
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# Matrix Indexing in Python\n",
    "\n",
    "Note that Python is zero-indexed"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "nbpresent": {
     "id": "2a9673a0-486d-4b32-b40c-ddce419b0890"
    },
    "slideshow": {
     "slide_type": "-"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "101\n",
      "47\n",
      "13\n"
     ]
    },
    {
     "ename": "IndexError",
     "evalue": "index 2 is out of bounds for axis 1 with size 2",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mIndexError\u001b[0m                                Traceback (most recent call last)",
      "\u001b[0;32m<ipython-input-2-b8e3cbbc21f2>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m      7\u001b[0m \u001b[0mprint\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mA\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m   \u001b[0;31m# A_32 in math\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      8\u001b[0m \u001b[0mprint\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mA\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m   \u001b[0;31m# A_22 in math\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 9\u001b[0;31m \u001b[0mprint\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mA\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m   \u001b[0;31m# A_23 in math. ERROR!\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
      "\u001b[0;31mIndexError\u001b[0m: index 2 is out of bounds for axis 1 with size 2"
     ]
    }
   ],
   "source": [
    "A = np.array([[101, 10], \n",
    "             [54,  13], \n",
    "             [10,  47]])\n",
    "\n",
    "\n",
    "print (A[0,0])   # A_11 in math\n",
    "print (A[2,1])   # A_32 in math\n",
    "print (A[1,1])   # A_22 in math\n",
    "print (A[1,2])   # A_23 in math. ERROR!"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "nbpresent": {
     "id": "fc2fbc75-2132-4ebb-a9f2-9b46be06e418"
    },
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# Vectors\n",
    "\n",
    "A vector is an $n \\times 1$ matrix:\n",
    "\n",
    "$$\n",
    "\\mathbf{x} = \n",
    "\\left[\n",
    "\\begin{array}{c}\n",
    "8  \\\\\n",
    "2.4 \\\\ \n",
    "1  \\\\\n",
    "-10 \n",
    "\\end{array}\n",
    "\\right]\n",
    "$$\n",
    "\n",
    "* We write $\\mathbf{x} \\in \\mathbb{R}^n$ (instead of $\\mathbf{x} \\in \\mathbb{R}^{n \\times 1}$)\n",
    "* The $i$th entry is $x_i$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true,
    "nbpresent": {
     "id": "3ae48be8-32df-4c2d-bb66-019b61ae3ffb"
    },
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# Indexing\n",
    "\n",
    "* Consider $\\mathbf{x} \\in \\mathbb{R}^4$ defined as $\\small\n",
    "\\mathbf{x} = \n",
    "\\left[\n",
    "\\begin{array}{c}\n",
    "8  \\\\\n",
    "2.4 \\\\ \n",
    "1  \\\\\n",
    "-10 \n",
    "\\end{array}\n",
    "\\right]\n",
    "$\n",
    "\n",
    "    * $x_1 =$ \n",
    "    * $x_4 =$ "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "nbpresent": {
     "id": "eeb056fb-7c8c-43fb-9dec-2225b2444944"
    },
    "slideshow": {
     "slide_type": "-"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "8.0\n",
      "-10.0\n"
     ]
    }
   ],
   "source": [
    "x = np.array([8, 2.4, 1, -10])  # in numpy a vector is a 1d array\n",
    "print(x[0])\n",
    "print(x[3])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "nbpresent": {
     "id": "aa2b7f0b-ed9c-4f59-b320-c3debbecc0d8"
    },
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# Addition\n",
    "\n",
    "If two matrices have the same size, we can add them by adding corresponding elements\n",
    "\n",
    "$$\n",
    "\\begin{bmatrix}\n",
    "1 & 2 \\\\\n",
    "3 & 4\n",
    "\\end{bmatrix} + \n",
    "\\begin{bmatrix}\n",
    "3 & 5 \\\\\n",
    "-1 & 0\n",
    "\\end{bmatrix} =\n",
    "\\begin{bmatrix}\n",
    "4 & 7 \\\\\n",
    "2 & 4\n",
    "\\end{bmatrix}\n",
    "$$\n",
    "\n",
    "* Subtraction is similar\n",
    "* Matrices of different sizes *cannot be added or subtracted*"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "nbpresent": {
     "id": "63ce192c-cb2c-47b7-b803-4f1ad79497b9"
    },
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[4 7]\n",
      " [2 4]]\n"
     ]
    }
   ],
   "source": [
    "A = np.array([[1, 2], \n",
    "              [3, 4]])\n",
    "\n",
    "B = np.array([[3, 5],\n",
    "              [-1, 0]])\n",
    "\n",
    "print(A + B)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "nbpresent": {
     "id": "b7b5a65e-65f6-4d96-983b-6fff6ec36289"
    },
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [
    {
     "ename": "ValueError",
     "evalue": "operands could not be broadcast together with shapes (2,2) (1,3) ",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mValueError\u001b[0m                                Traceback (most recent call last)",
      "\u001b[0;32m<ipython-input-5-80349e9e711d>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m      4\u001b[0m \u001b[0mC\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0marray\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m3\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      5\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 6\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mA\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mC\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
      "\u001b[0;31mValueError\u001b[0m: operands could not be broadcast together with shapes (2,2) (1,3) "
     ]
    }
   ],
   "source": [
    "A = np.array([[1, 2], \n",
    "              [3, 4]])\n",
    "\n",
    "C = np.array([[1, 2, 3]])\n",
    "\n",
    "print(A + C)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "nbpresent": {
     "id": "d26df4f9-5f14-4796-bd8a-ee88d48a4212"
    },
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[11 22]\n",
      " [13 24]]\n"
     ]
    }
   ],
   "source": [
    "# Beware: broadcasting. This will work, and is a nice feature, but\n",
    "# is *not* an accepted linear algebra operation\n",
    "\n",
    "A = np.array([[1, 2], \n",
    "              [3, 4]])\n",
    "\n",
    "D = np.array([10, 20])\n",
    "print(A + D)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "nbpresent": {
     "id": "65b7d294-59a0-4693-8b1c-c84aa970b03f"
    },
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[11 12]\n",
      " [23 24]]\n",
      "[[1, 3], array([-2,  0]), [1, 3], array([-2,  0])]\n"
     ]
    }
   ],
   "source": [
    "# Do this to broadcast a column vector\n",
    "A = np.array([[1, 2], \n",
    "              [3, 4]])\n",
    "\n",
    "D = np.array([[10], [20]])   # a 2x1 vector or \"column vector\"\n",
    "\n",
    "print(A + D)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "nbpresent": {
     "id": "9d088a56-fadd-4fba-b306-dd45fde526cd"
    },
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# Scalar Multiplication\n",
    "\n",
    "A *scalar* $x \\in \\mathbb{R}$ is a real number (i.e., not a vector)\n",
    "\n",
    "$$\\text{e.g.,   } 2,\\, 3,\\, \\pi,\\, \\sqrt{2},\\, 1.843,\\, \\ldots$$\n",
    "\n",
    "Scalar times a matrix:\n",
    "\n",
    "$$\n",
    "2\n",
    "\\cdot\n",
    "\\begin{bmatrix}\n",
    "1 & 3 \\\\\n",
    "-2 & 0 \n",
    "\\end{bmatrix} \n",
    "= \n",
    "\\begin{bmatrix}\n",
    "2 & 6 \\\\\n",
    "-4 & 0 \n",
    "\\end{bmatrix} \n",
    "$$\n",
    "\n",
    "(multiply each entry by the scalar)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "nbpresent": {
     "id": "c0be19b4-598e-49af-ba9b-29bfc7284b3c"
    },
    "slideshow": {
     "slide_type": "-"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[ 2  6]\n",
      " [-4  0]]\n"
     ]
    }
   ],
   "source": [
    "B = 2 * np.array([[1,3], [-2,0]])\n",
    "print(B)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "nbpresent": {
     "id": "58b19dac-35d9-4626-9264-a348b84aa711"
    },
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# Dot Product\n",
    "\n",
    "* A type of multiplication between vectors\n",
    "* Let $\\mathbf{x}, \\mathbf{y}$ be vectors of same size ($\\mathbf{x}, \\mathbf{y} \\in  \\mathbb{R}^n$). \n",
    "\n",
    "* Their dot product is\n",
    "  $$\n",
    "  \\begin{align*}\n",
    "  \\mathbf{x}^T \\mathbf{y} \n",
    "  &= \\sum_{i=1}^n x_i y_i \\\\\n",
    "  &=\n",
    "  \\begin{bmatrix}x_1 & x_2 & \\ldots & x_n \\end{bmatrix}\n",
    "  \\begin{bmatrix}y_1 \\\\ y_2 \\\\ \\vdots \\\\ y_n \\end{bmatrix}\n",
    "  \\end{align*}\n",
    "  $$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "nbpresent": {
     "id": "fa1ed065-713e-4b16-9bf2-058d20fb0222"
    },
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [
    {
     "ename": "ValueError",
     "evalue": "shapes (3,) and (4,) not aligned: 3 (dim 0) != 4 (dim 0)",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mValueError\u001b[0m                                Traceback (most recent call last)",
      "\u001b[0;32m<ipython-input-12-d7449816218d>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m      2\u001b[0m \u001b[0my\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0marray\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m4\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m5\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m6\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      3\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 4\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdot\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
      "\u001b[0;31mValueError\u001b[0m: shapes (3,) and (4,) not aligned: 3 (dim 0) != 4 (dim 0)"
     ]
    }
   ],
   "source": [
    "x = np.array([1,2,3])\n",
    "y = np.array([2,4,5])\n",
    "\n",
    "print(np.dot(x, y))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "nbpresent": {
     "id": "1c85bcac-de56-40d3-af5e-1e7e027a93d6"
    },
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# Matrix-Matrix Multiplication\n",
    "\n",
    "Can multiply two matrices **if their inner dimensions match**\n",
    "\n",
    "$$\n",
    "  A \\in \\mathbb{R}^{m \\times n}, \n",
    "  B \\in \\mathbb{R}^{n \\times p}\n",
    "$$\n",
    "\n",
    "$$\n",
    "  C = AB \\quad \\in \\mathbb{R}^{m \\times p}\n",
    "$$\n",
    "\n",
    "The product has entries\n",
    "$$\n",
    "  C_{ij} = \\sum_{k=1}^n A_{ik} B_{kj}\n",
    "$$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "nbpresent": {
     "id": "c79e9614-b6a2-43ff-8413-7599d92ebcd6"
    },
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# Matrix-Matrix Multiplication\n",
    "\n",
    "$$\n",
    "C_{ij} = \\sum_{k=1}^n A_{ik} B_{kj}\n",
    "$$\n",
    "\n",
    "Dot product of $i$th row of $A$ and $j$th column of $B$.\n",
    "\n",
    "$\\newcommand{\\r}{\\mathbf}$\n",
    "\n",
    "$$\n",
    "\\begin{bmatrix}\n",
    "c_{11} & c_{12} & c_{13}\\\\\n",
    "c_{21} & c_{22} & c_{23}\\\\\n",
    "c_{31} & \\r{c_{32}} & c_{33}\\\\\n",
    "c_{41} & c_{42} & c_{43}\n",
    "\\end{bmatrix}\n",
    "=\n",
    "\\begin{bmatrix}\n",
    "a_{11} & a_{12} \\\\\n",
    "a_{21} & a_{22} \\\\\n",
    "\\r{a_{31}} & \\r{a_{32}} \\\\\n",
    "a_{41} & a_{42} \\\\\n",
    "\\end{bmatrix}\n",
    "\\begin{bmatrix}\n",
    "b_{11} & \\r{b_{12}} & b_{13} \\\\\n",
    "b_{21} & \\r{b_{22}} & b_{23} \n",
    "\\end{bmatrix}\n",
    "$$\n",
    "\n",
    "$$\n",
    "c_{32} = a_{31}b_{12} + a_{32}b_{22}\n",
    "$$\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "nbpresent": {
     "id": "cd5ffdba-6e4d-4c09-95f3-abe15d379dd1"
    },
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# Example\n",
    "\n",
    "$$\n",
    "A = \n",
    "\\begin{bmatrix}\n",
    "1 & -1 \\\\ \n",
    "0 &  3 \n",
    "\\end{bmatrix}, \\quad\n",
    "B = \n",
    "\\begin{bmatrix}\n",
    "3 & 2 \\\\\n",
    "-1 & 0\n",
    "\\end{bmatrix}\n",
    "$$\n",
    "\n",
    "$$\n",
    "AB = \\begin{bmatrix}\n",
    "1 & -1 \\\\ \n",
    "0 &  3 \n",
    "\\end{bmatrix}\n",
    "\\begin{bmatrix}\n",
    "3 & 2 \\\\\n",
    "-1 & 0\n",
    "\\end{bmatrix}\n",
    "= \n",
    "$$\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "nbpresent": {
     "id": "0d5c6005-cfeb-4892-bb07-92f2de2cb98b"
    },
    "slideshow": {
     "slide_type": "-"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[ 3 -2]\n",
      " [ 0  0]]\n"
     ]
    }
   ],
   "source": [
    "A = np.array([[1, -1], [0, 3]])\n",
    "B = np.array([[3,  2], [-1, 0]])\n",
    "print(A * B)   # NOT matrix multiplication"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "nbpresent": {
     "id": "0349337c-7d36-4c9c-9b79-7136ae5add95"
    },
    "slideshow": {
     "slide_type": "-"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[ 4  2]\n",
      " [-3  0]]\n",
      "[[ 4  2]\n",
      " [-3  0]]\n"
     ]
    }
   ],
   "source": [
    "# OH NO! A*B gives elementwise multiplication!\n",
    "\n",
    "# Use np.dot for matrix multiplication\n",
    "print(np.dot(A, B)) \n",
    "\n",
    "print(A.dot(B))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "nbpresent": {
     "id": "15ec1f58-35b2-4f51-a433-715b0944f1f9"
    },
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# Multiplication Properties\n",
    "\n",
    "* Associative\n",
    "  $$\n",
    "  (AB)C = A(BC)\n",
    "  $$\n",
    "* Distributive\n",
    "  $$  A(B+C) = AB + AC $$\n",
    "  $$  (B+C)D = BD + CD $$\n",
    "* **Not commutative**\n",
    "  $$\\r{AB \\neq BA}$$\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "nbpresent": {
     "id": "b14e5fe8-84d2-423b-a98b-b8d2f4d4387f"
    },
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# Matrix-Vector Multiplication\n",
    "\n",
    "A (worthy) special case of matrix-matrix multiplication:\n",
    "\n",
    "$$\n",
    "A \\in \\mathbb{R}^{m \\times n}, \\quad \\mathbf{x} \\in \\mathbb{R}^n\n",
    "$$\n",
    "\n",
    "$$\n",
    "\\mathbf{y} = A\\mathbf{x} \\in \\mathbb{R}^{m}\n",
    "$$\n",
    "\n",
    "Definition\n",
    "$$\n",
    "y_i = \\sum_{j=1}^n A_{ij} x_j\n",
    "$$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "nbpresent": {
     "id": "2bca12c8-4b46-47ed-9887-cf232cf24b8d"
    },
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# Matrix-Vector Multiplication\n",
    "\n",
    "$$\n",
    "y_i = \\sum_{j=1}^n A_{ij} x_j\n",
    "$$\n",
    "\n",
    "\n",
    "$$\n",
    "\\begin{bmatrix}\n",
    "y_1 \\\\ \n",
    "y_2 \\\\\n",
    "\\r{y_3} \\\\\n",
    "y_4\n",
    "\\end{bmatrix}\n",
    " =\n",
    " \\begin{bmatrix}\n",
    " a_{11} & a_{12} \\\\\n",
    " a_{21} & a_{22} \\\\\n",
    " \\r{a_{31}} & \\r{a_{32}} \\\\\n",
    " a_{41} & a_{42}\n",
    " \\end{bmatrix}\n",
    " \\begin{bmatrix}\n",
    " \\r{x_1} \\\\\n",
    " \\r{x_2}\n",
    " \\end{bmatrix}\n",
    "$$\n",
    "\n",
    "$$\n",
    "y_3 = a_{31} x_1 + a_{32} x_2\n",
    "$$\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "nbpresent": {
     "id": "712f78bf-e8b4-4b88-a1fc-daf51a09b60c"
    },
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# Example\n",
    "\n",
    "$$\n",
    "A = \n",
    "\\begin{bmatrix}\n",
    "  1 & -1 \\\\ \n",
    "  0 &  3 \n",
    "\\end{bmatrix}, \n",
    "\\quad \n",
    "\\mathbf{x} = \\begin{bmatrix}1 \\\\ -1\\end{bmatrix}\n",
    "  \\quad\n",
    "  \\mathbf{z} = \\begin{bmatrix}8 \\\\ 1.5\\end{bmatrix}\n",
    "$$\n",
    "\n",
    "\n",
    "$$\n",
    "A \\mathbf{x} = \n",
    "  \\begin{bmatrix}1 & -1 \\\\ 0 &  3 \\end{bmatrix}\n",
    "  \\begin{bmatrix}1 \\\\ -1\\end{bmatrix}\n",
    "  = \n",
    "$$\n",
    "\n",
    "$$\n",
    "A \\mathbf{z} = \\qquad \\qquad \\qquad \\quad\n",
    "$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "nbpresent": {
     "id": "13e0c2ea-bde5-483d-b50f-62312aff62a6"
    },
    "slideshow": {
     "slide_type": "-"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[ 2 -3]\n",
      "[6.5 4.5]\n"
     ]
    }
   ],
   "source": [
    "A = np.array([[1, -1], [0, 3]])\n",
    "\n",
    "x = np.array([1, -1])\n",
    "z = np.array([8, 1.5])\n",
    "\n",
    "print(np.dot(A, x))\n",
    "print(np.dot(A, z))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[ 1 -4]\n"
     ]
    }
   ],
   "source": [
    "A = np.array([[1, -1], [0, 3]])\n",
    "x = np.array([1, -1])\n",
    "\n",
    "print(np.dot(x,A))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "nbpresent": {
     "id": "13e0c2ea-bde5-483d-b50f-62312aff62a6"
    },
    "slideshow": {
     "slide_type": "-"
    }
   },
   "outputs": [
    {
     "ename": "ValueError",
     "evalue": "shapes (2,2) and (1,2) not aligned: 2 (dim 1) != 1 (dim 0)",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mValueError\u001b[0m                                Traceback (most recent call last)",
      "\u001b[0;32m<ipython-input-19-3c0e8cd0229e>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m      6\u001b[0m \u001b[0mx_colvec\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0marray\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      7\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 8\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdot\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mA\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mx_rowvec\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# error\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m      9\u001b[0m \u001b[0;31m#print(np.dot(A, x_colvec))\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     10\u001b[0m \u001b[0;31m#print(np.dot(x_rowvec, A))\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;31mValueError\u001b[0m: shapes (2,2) and (1,2) not aligned: 2 (dim 1) != 1 (dim 0)"
     ]
    }
   ],
   "source": [
    "A = np.array([[1, -1], [0, 3]])\n",
    "\n",
    "# A vector can also be represented as a 2D array. In this case \n",
    "# you must be careful about whether it is a row or column vector\n",
    "x_rowvec = np.array([[1, -1]])\n",
    "x_colvec = np.array([[1], [-1]])\n",
    "\n",
    "print(np.dot(A, x_rowvec)) # error\n",
    "#print(np.dot(A, x_colvec))\n",
    "#print(np.dot(x_rowvec, A))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "nbpresent": {
     "id": "df982e8e-91da-4290-9346-f0877ab6a042"
    },
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# Transpose\n",
    "\n",
    "Transposition of a matrix swaps the rows and columns\n",
    "$$\n",
    "A = \\begin{bmatrix}1 & -1 \\\\ 0 &  3 \\end{bmatrix}, \n",
    "\\quad\n",
    "A^T = \\begin{bmatrix}1 & 0 \\\\ -1 &  3 \\end{bmatrix}.\n",
    "$$\n",
    "\n",
    "**Definition**:\n",
    "\n",
    "* Let $A \\in \\mathbb{R}^{m \\times n}$\n",
    "* The **transpose** $A^T \\in \\mathbb{R}^{n \\times m}$ has entries\n",
    "\n",
    "$$\n",
    "(A^T)_{ij} = A_{ji}.\n",
    "$$\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "nbpresent": {
     "id": "54ee526c-4d39-4b1a-b75f-f61be931c900"
    },
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "# Example\n",
    "\n",
    "$\\newcommand{\\b}{\\mathbf}$\n",
    "\n",
    "$$\n",
    "A = \\begin{bmatrix} 3 & 2 \\\\ -1 & 0 \\\\ 1 & 4 \\end{bmatrix}\\qquad\n",
    "A^T = \n",
    "\\begin{bmatrix} 3 & -1 & 1 \\\\ 2 & 0 & 4 \\end{bmatrix}\n",
    "$$\n",
    "\n",
    "\n",
    "\n",
    "$$\n",
    "\\b{x} = \\begin{bmatrix} 1 \\\\ -3 \\\\ 2\\end{bmatrix}\n",
    "\\qquad\n",
    "\\b{x}^T = \n",
    "\\begin{bmatrix} 1 & -3 & 2\\end{bmatrix}\n",
    "$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "nbpresent": {
     "id": "056c0cfd-c621-4803-bfc2-4fbf10bededf"
    },
    "slideshow": {
     "slide_type": "-"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[ 3 -1  1]\n",
      " [ 2  0  4]]\n"
     ]
    }
   ],
   "source": [
    "A = np.array([[3, 2], [-1, 0], [1, 4]])\n",
    "\n",
    "print(A.T)  # numpy array has a transpose property"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "nbpresent": {
     "id": "7fb2b059-98bf-48b8-b40d-4f2330e74a80"
    },
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# Vector Norm\n",
    "\n",
    "The *norm* of a vector is\n",
    "  $$\n",
    "  \\begin{align*}\n",
    "  \\| \\b{x} \\| &= \\sqrt{x_1^2 + x_2^2 + \\ldots + x_n^2} \\\\\n",
    "              &= \\sqrt{\\b{x}^T \\b{x}}\n",
    "  \\end{align*}\n",
    "  $$\n",
    "\n",
    "Geometric interpretation: length of the vector \n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "nbpresent": {
     "id": "ed1f4a24-b662-4e0e-a450-1b243e7595a6"
    },
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# Transpose Properties\n",
    "\n",
    "* Transpose of transpose\n",
    "\n",
    "  $$ (A^T)^T = A $$\n",
    "\n",
    "* Transpose of sum\n",
    "\n",
    "  $$ (A+B)^T = A^T + B^T $$\n",
    "\n",
    "* Transpose of product\n",
    "\n",
    "  $$ (AB)^T = B^T A^T $$\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "nbpresent": {
     "id": "6435e1f9-aca2-4265-8ae0-b90ab9d4302a"
    },
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# Identity\n",
    "\n",
    "The identity matrix $I \\in \\mathbb{R}^{n \\times n}$ has entries\n",
    "\n",
    "$$\n",
    "I_{ij} = \\begin{cases}1 & i=j \\\\ 0 & i \\neq j\\end{cases},\n",
    "$$\n",
    "\n",
    "$$\n",
    "I_{1 \\times 1} = [1], \\qquad\n",
    "  I_{2 \\times 2} = \\begin{bmatrix}1 & 0 \\\\ 0 & 1\\end{bmatrix},\n",
    "    \\qquad     \n",
    "  I_{3 \\times 3} = \\begin{bmatrix}1 & 0 & 0 \\\\ 0 & 1 & 0 \\\\ 0 & 0 & 1\\end{bmatrix}.\n",
    "$$\n",
    "\n",
    "For any $A, B$ of appropriate dimensions\n",
    "$$\n",
    "\\begin{align*}\n",
    "  IA &= A \\\\\n",
    "  BI &= B\n",
    "  \\end{align*}\n",
    "  $$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "nbpresent": {
     "id": "c7e8b795-a3a2-4232-bcb7-4b4737e02aa4"
    },
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [],
   "source": [
    "# Use numpy.eye to create identity matrices of different dimensions\n",
    "\n",
    "I = np.eye(1)\n",
    "print(I)\n",
    "\n",
    "I = np.eye(2)\n",
    "print(I)\n",
    "\n",
    "I = np.eye(3)\n",
    "print(I)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "nbpresent": {
     "id": "c12378cf-3605-4a0c-894e-6017e648727c"
    },
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [],
   "source": [
    "I = np.eye(2)\n",
    "A = np.array([[1,2], [3,4]])\n",
    "\n",
    "print(A)\n",
    "print(np.dot(A, I))\n",
    "print(np.dot(I, A))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "nbpresent": {
     "id": "ffb6f363-6fa0-4bee-92bd-db142814787a"
    },
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# Inverse\n",
    "\n",
    "The inverse $A^{-1} \\in \\mathbb{R}^{n \\times n}$ of a ***square*** matrix $A \\in \\mathbb{R}^{n \\times n}$ satisfies\n",
    "$$\n",
    "AA^{-1} = I = A^{-1}A\n",
    "$$\n",
    "\n",
    "Compare to division of scalars\n",
    "$$\n",
    "x x^{-1} = 1 = x^{-1} x\n",
    "$$\n",
    "\n",
    "**Not all matrices are invertible**\n",
    "\n",
    "* E.g., $A$ not square, $A = [0]$, $A = \\begin{bmatrix}0 & 0\\\\ 0 & 0\\end{bmatrix}$, many more"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "nbpresent": {
     "id": "7b7cf2c5-4712-4a1c-b916-e78ee3f15440"
    },
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# Inverse\n",
    "\n",
    "$$\n",
    "A = \n",
    "\\begin{bmatrix}1 & 0 \\\\ 0 & 2\\end{bmatrix},  \\qquad\n",
    "B = \\begin{bmatrix} 1 & 0 \\\\ 0 & \\frac{1}{2}\\end{bmatrix}\n",
    "$$\n",
    "\n",
    "Is $B$ the inverse of $A$?"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "$$\n",
    "A = \\begin{bmatrix}1 & -1 \\\\ 0 &  3 \\end{bmatrix} \\qquad \n",
    "A^{-1} = \\begin{bmatrix}1 & \\frac{1}{3} \\\\ 0 & \\frac{1}{3}\\end{bmatrix}\n",
    "$$\n",
    "Verify on your own.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "nbpresent": {
     "id": "ea7f0954-eabf-4fa5-aa61-ac11fa5dbd43"
    },
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[1. 1.]\n",
      " [0. 1.]]\n"
     ]
    },
    {
     "ename": "ZeroDivisionError",
     "evalue": "division by zero",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mZeroDivisionError\u001b[0m                         Traceback (most recent call last)",
      "\u001b[0;32m<ipython-input-6-b9eea26c85d9>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m      6\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlinalg\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0minv\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mA\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      7\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 8\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m/\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
      "\u001b[0;31mZeroDivisionError\u001b[0m: division by zero"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "\n",
    "A = np.array([[1, -1], [0, 1]])\n",
    "\n",
    "# Use numpy.linalg.inv to invert a matrix\n",
    "print(np.linalg.inv(A))\n",
    "\n",
    "print(1/0)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "nbpresent": {
     "id": "aae603e1-6e1a-45ae-bac3-59bbf3acea7d"
    },
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# Inverse Properties\n",
    "\n",
    "* Inverse of inverse\n",
    "\n",
    " $$ (A^{-1})^{-1} = A $$\n",
    " \n",
    "* Inverse of product\n",
    "\n",
    " $$(AB)^{-1} = B^{-1}A^{-1} $$\n",
    "\n",
    "* Inverse of transpose \n",
    " $$ (A^{-1})^T = (A^T)^{-1} := A^{-T} $$\n"
   ]
  }
 ],
 "metadata": {
  "anaconda-cloud": {},
  "celltoolbar": "Slideshow",
  "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.1"
  },
  "nbpresent": {
   "slides": {
    "075ca6a0-0a22-4236-b1d2-499bed6095d9": {
     "id": "075ca6a0-0a22-4236-b1d2-499bed6095d9",
     "prev": "c16392bb-f5fe-4417-b6fc-273e88d42cc5",
     "regions": {
      "c6a1861c-0c36-4d8d-b83e-135e4edee00e": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "9d088a56-fadd-4fba-b306-dd45fde526cd",
        "part": "whole"
       },
       "id": "c6a1861c-0c36-4d8d-b83e-135e4edee00e"
      }
     }
    },
    "0ef16c18-acdd-43e0-9ac1-44b4a5b52580": {
     "id": "0ef16c18-acdd-43e0-9ac1-44b4a5b52580",
     "prev": "c18a52fa-7f67-45d3-bd8b-8db1b9dcb2f0",
     "regions": {
      "3950c1f7-f199-461a-ba75-f7ede025646d": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "d26df4f9-5f14-4796-bd8a-ee88d48a4212",
        "part": "whole"
       },
       "id": "3950c1f7-f199-461a-ba75-f7ede025646d"
      }
     }
    },
    "0fbf9b25-5cf7-4cf8-9b7d-99648ae86322": {
     "id": "0fbf9b25-5cf7-4cf8-9b7d-99648ae86322",
     "prev": "14ea035a-e9cd-4e5a-a801-2807d2b8d03d",
     "regions": {
      "66b613d3-181f-4577-82a5-cd61d91c11ae": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "63ce192c-cb2c-47b7-b803-4f1ad79497b9",
        "part": "whole"
       },
       "id": "66b613d3-181f-4577-82a5-cd61d91c11ae"
      }
     }
    },
    "100d4dcb-a16f-4770-b888-90e9d4169f0a": {
     "id": "100d4dcb-a16f-4770-b888-90e9d4169f0a",
     "prev": "89cbbb04-7edd-4439-8174-6ffb2fe1a64b",
     "regions": {
      "2953f026-68ed-4023-91cc-4d37afe9c63c": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "c79e9614-b6a2-43ff-8413-7599d92ebcd6",
        "part": "whole"
       },
       "id": "2953f026-68ed-4023-91cc-4d37afe9c63c"
      }
     }
    },
    "13c5757b-e27e-4749-b896-086c7e5bd32e": {
     "id": "13c5757b-e27e-4749-b896-086c7e5bd32e",
     "prev": "53ffd595-d79e-4518-97e7-d549a04e5442",
     "regions": {
      "226a322d-60f6-49bc-975e-6235ef0d91e4": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "88982e7f-95ea-4222-ad68-0d7e43911762",
        "part": "whole"
       },
       "id": "226a322d-60f6-49bc-975e-6235ef0d91e4"
      }
     }
    },
    "14ea035a-e9cd-4e5a-a801-2807d2b8d03d": {
     "id": "14ea035a-e9cd-4e5a-a801-2807d2b8d03d",
     "prev": "528f39c6-855b-4283-baad-43f1dd7e8230",
     "regions": {
      "e1c32be8-58a8-4ea2-bcac-05fae0a63bf9": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "aa2b7f0b-ed9c-4f59-b320-c3debbecc0d8",
        "part": "whole"
       },
       "id": "e1c32be8-58a8-4ea2-bcac-05fae0a63bf9"
      }
     }
    },
    "27d4e307-e004-400c-a74a-d99e9a46bfcc": {
     "id": "27d4e307-e004-400c-a74a-d99e9a46bfcc",
     "prev": "bc0a1c63-55e5-4b4e-b3dc-2661ccbfc278",
     "regions": {
      "e426a3ac-67c2-4580-9ccd-3399a111ee00": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "ed1f4a24-b662-4e0e-a450-1b243e7595a6",
        "part": "whole"
       },
       "id": "e426a3ac-67c2-4580-9ccd-3399a111ee00"
      }
     }
    },
    "2eb37443-9459-40ae-b6d3-76d797be45bb": {
     "id": "2eb37443-9459-40ae-b6d3-76d797be45bb",
     "prev": "3e5a2b9c-68df-49fe-bbef-01436678997d",
     "regions": {
      "2a6316c0-c6ee-42be-b054-f2f4a16b28be": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "2bca12c8-4b46-47ed-9887-cf232cf24b8d",
        "part": "whole"
       },
       "id": "2a6316c0-c6ee-42be-b054-f2f4a16b28be"
      }
     }
    },
    "3549f444-3754-49b3-8568-d0d3d5cb86d0": {
     "id": "3549f444-3754-49b3-8568-d0d3d5cb86d0",
     "prev": "89c0def1-b5e2-47ff-adb9-55cc8a3ec6ce",
     "regions": {
      "d6084ed4-7222-4068-a972-1bc1b14b8eca": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "fa1ed065-713e-4b16-9bf2-058d20fb0222",
        "part": "whole"
       },
       "id": "d6084ed4-7222-4068-a972-1bc1b14b8eca"
      }
     }
    },
    "3c967a8c-ef4a-4933-92f7-bcf116eafb3b": {
     "id": "3c967a8c-ef4a-4933-92f7-bcf116eafb3b",
     "prev": "6dc633e7-d8bc-4ff2-bf52-bc330f129200",
     "regions": {
      "c8e44102-009e-42f9-82e1-2f01381ec9ac": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "45eef18f-3497-4513-98ed-f31ab0c8d828",
        "part": "whole"
       },
       "id": "c8e44102-009e-42f9-82e1-2f01381ec9ac"
      }
     }
    },
    "3e5a2b9c-68df-49fe-bbef-01436678997d": {
     "id": "3e5a2b9c-68df-49fe-bbef-01436678997d",
     "prev": "75889c40-0f0b-41a0-9ee5-559712e948de",
     "regions": {
      "f298f743-a0f4-42cb-835e-6cb1670622e6": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "b14e5fe8-84d2-423b-a98b-b8d2f4d4387f",
        "part": "whole"
       },
       "id": "f298f743-a0f4-42cb-835e-6cb1670622e6"
      }
     }
    },
    "3efdf278-db0b-49d5-b075-83118980fb3f": {
     "id": "3efdf278-db0b-49d5-b075-83118980fb3f",
     "prev": "7f8061ee-5bca-4376-9eda-15e01bb671d8",
     "regions": {
      "ed40c614-bc81-4c9f-aa98-48f61e3f43a7": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "fc2fbc75-2132-4ebb-a9f2-9b46be06e418",
        "part": "whole"
       },
       "id": "ed40c614-bc81-4c9f-aa98-48f61e3f43a7"
      }
     }
    },
    "4b036fd0-a8f3-42db-a121-5bbb0dbabaca": {
     "id": "4b036fd0-a8f3-42db-a121-5bbb0dbabaca",
     "prev": "7ec536c1-7937-405f-bb2f-535e777b541e",
     "regions": {
      "edc1e1e7-4eb0-4259-8b33-5474de3e16dc": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "ffb6f363-6fa0-4bee-92bd-db142814787a",
        "part": "whole"
       },
       "id": "edc1e1e7-4eb0-4259-8b33-5474de3e16dc"
      }
     }
    },
    "528f39c6-855b-4283-baad-43f1dd7e8230": {
     "id": "528f39c6-855b-4283-baad-43f1dd7e8230",
     "prev": "ac35ca64-e191-4f31-baa4-6f733df0f593",
     "regions": {
      "807c0860-31c8-49e1-bdcf-4dcfd7190060": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "eeb056fb-7c8c-43fb-9dec-2225b2444944",
        "part": "whole"
       },
       "id": "807c0860-31c8-49e1-bdcf-4dcfd7190060"
      }
     }
    },
    "535546de-b284-480f-8e18-9c4e209a1795": {
     "id": "535546de-b284-480f-8e18-9c4e209a1795",
     "prev": "4b036fd0-a8f3-42db-a121-5bbb0dbabaca",
     "regions": {
      "2a32ce1a-d496-4b99-984a-2512f0efc9d1": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "7b7cf2c5-4712-4a1c-b916-e78ee3f15440",
        "part": "whole"
       },
       "id": "2a32ce1a-d496-4b99-984a-2512f0efc9d1"
      }
     }
    },
    "53ffd595-d79e-4518-97e7-d549a04e5442": {
     "id": "53ffd595-d79e-4518-97e7-d549a04e5442",
     "prev": "9680f60d-36ba-44a8-a7b3-346e78c97d22",
     "regions": {
      "ec6a3176-f52a-4082-a371-b5ff409fe1ae": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "94e2833b-1345-49a7-85e2-004c324144ae",
        "part": "whole"
       },
       "id": "ec6a3176-f52a-4082-a371-b5ff409fe1ae"
      }
     }
    },
    "592486fc-8781-49d6-8dd9-98be337a53ac": {
     "id": "592486fc-8781-49d6-8dd9-98be337a53ac",
     "prev": null,
     "regions": {
      "6c32b875-bf6d-4e09-9d04-2607e6a82438": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "3ce13dbd-b25d-494c-a841-52b237d8240a",
        "part": "whole"
       },
       "id": "6c32b875-bf6d-4e09-9d04-2607e6a82438"
      }
     }
    },
    "64e50e3d-59d7-4cc0-8f81-1a83c0f28b4b": {
     "id": "64e50e3d-59d7-4cc0-8f81-1a83c0f28b4b",
     "prev": "68671e3e-c617-4431-a8f9-8142afeecbfe",
     "regions": {
      "8d3ca547-97f5-4d12-9c70-40b52e531e52": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "d5d9c223-d434-40c0-b30d-17fe548f9f21",
        "part": "whole"
       },
       "id": "8d3ca547-97f5-4d12-9c70-40b52e531e52"
      }
     }
    },
    "68671e3e-c617-4431-a8f9-8142afeecbfe": {
     "id": "68671e3e-c617-4431-a8f9-8142afeecbfe",
     "prev": "d580fa0a-54e0-43b4-b064-8a15eb4e1fbf",
     "regions": {
      "437d9b80-9d40-420e-8244-135542c1ed06": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "f6ebe35f-72f3-4f6f-aaae-cd1cb51ef087",
        "part": "whole"
       },
       "id": "437d9b80-9d40-420e-8244-135542c1ed06"
      }
     }
    },
    "6dc633e7-d8bc-4ff2-bf52-bc330f129200": {
     "id": "6dc633e7-d8bc-4ff2-bf52-bc330f129200",
     "prev": "64e50e3d-59d7-4cc0-8f81-1a83c0f28b4b",
     "regions": {
      "d79b79bc-747e-4ec1-a333-d3a3c51b750a": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "0bcd3d94-8e18-4bd3-8598-178ae406db64",
        "part": "whole"
       },
       "id": "d79b79bc-747e-4ec1-a333-d3a3c51b750a"
      }
     }
    },
    "702d32dc-4a9c-41d2-8e70-02185c91702c": {
     "id": "702d32dc-4a9c-41d2-8e70-02185c91702c",
     "prev": "b2eb3ab0-d0f1-4d48-93da-1b3eb8fa4a8a",
     "regions": {
      "6e6a3ce6-a843-4ad3-9d67-1e26a114757c": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "0349337c-7d36-4c9c-9b79-7136ae5add95",
        "part": "whole"
       },
       "id": "6e6a3ce6-a843-4ad3-9d67-1e26a114757c"
      }
     }
    },
    "728326ae-1291-4f41-95ad-de17109e0c6f": {
     "id": "728326ae-1291-4f41-95ad-de17109e0c6f",
     "prev": "7667fcbb-27a6-43d8-94f9-e8270b3e1f1f",
     "regions": {
      "af12bf35-baa1-4299-8407-9caa913da565": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "aae603e1-6e1a-45ae-bac3-59bbf3acea7d",
        "part": "whole"
       },
       "id": "af12bf35-baa1-4299-8407-9caa913da565"
      }
     }
    },
    "75889c40-0f0b-41a0-9ee5-559712e948de": {
     "id": "75889c40-0f0b-41a0-9ee5-559712e948de",
     "prev": "702d32dc-4a9c-41d2-8e70-02185c91702c",
     "regions": {
      "9da116e6-7dfd-46b2-b36e-a8b443f61bdc": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "15ec1f58-35b2-4f51-a433-715b0944f1f9",
        "part": "whole"
       },
       "id": "9da116e6-7dfd-46b2-b36e-a8b443f61bdc"
      }
     }
    },
    "7667fcbb-27a6-43d8-94f9-e8270b3e1f1f": {
     "id": "7667fcbb-27a6-43d8-94f9-e8270b3e1f1f",
     "prev": "535546de-b284-480f-8e18-9c4e209a1795",
     "regions": {
      "ccde5357-2d69-4f0c-8608-92f0de1bb3d6": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "ea7f0954-eabf-4fa5-aa61-ac11fa5dbd43",
        "part": "whole"
       },
       "id": "ccde5357-2d69-4f0c-8608-92f0de1bb3d6"
      }
     }
    },
    "78b54720-eda7-4795-8ce9-8c92cd6917b4": {
     "id": "78b54720-eda7-4795-8ce9-8c92cd6917b4",
     "prev": "b466065b-2589-4700-b9ec-f8e6cdbae784",
     "regions": {
      "3f76ce44-798d-491c-9135-ea5be4ac3390": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "13e0c2ea-bde5-483d-b50f-62312aff62a6",
        "part": "whole"
       },
       "id": "3f76ce44-798d-491c-9135-ea5be4ac3390"
      }
     }
    },
    "7ec536c1-7937-405f-bb2f-535e777b541e": {
     "id": "7ec536c1-7937-405f-bb2f-535e777b541e",
     "prev": "c679284d-ef3b-4913-ba19-bce758984f1b",
     "regions": {
      "efbbc961-f061-4e74-b5e5-e87641d08284": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "c12378cf-3605-4a0c-894e-6017e648727c",
        "part": "whole"
       },
       "id": "efbbc961-f061-4e74-b5e5-e87641d08284"
      }
     }
    },
    "7f8061ee-5bca-4376-9eda-15e01bb671d8": {
     "id": "7f8061ee-5bca-4376-9eda-15e01bb671d8",
     "prev": "3c967a8c-ef4a-4933-92f7-bcf116eafb3b",
     "regions": {
      "fc72d6be-a3f0-4c2d-a159-7e3a9dd3dc1e": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "2a9673a0-486d-4b32-b40c-ddce419b0890",
        "part": "whole"
       },
       "id": "fc72d6be-a3f0-4c2d-a159-7e3a9dd3dc1e"
      }
     }
    },
    "7fdad8ba-5cd5-45e2-af5d-cd3bf78d763a": {
     "id": "7fdad8ba-5cd5-45e2-af5d-cd3bf78d763a",
     "prev": "faa71446-28df-4d6e-98c8-d9bd842a173e",
     "regions": {
      "1f901aaa-6b82-4ba2-9c9b-dc399fc06519": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "056c0cfd-c621-4803-bfc2-4fbf10bededf",
        "part": "whole"
       },
       "id": "1f901aaa-6b82-4ba2-9c9b-dc399fc06519"
      }
     }
    },
    "89c0def1-b5e2-47ff-adb9-55cc8a3ec6ce": {
     "id": "89c0def1-b5e2-47ff-adb9-55cc8a3ec6ce",
     "prev": "7fdad8ba-5cd5-45e2-af5d-cd3bf78d763a",
     "regions": {
      "bb225761-c2ed-48f6-b3ae-fe445c96bf88": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "58b19dac-35d9-4626-9264-a348b84aa711",
        "part": "whole"
       },
       "id": "bb225761-c2ed-48f6-b3ae-fe445c96bf88"
      }
     }
    },
    "89cbbb04-7edd-4439-8174-6ffb2fe1a64b": {
     "id": "89cbbb04-7edd-4439-8174-6ffb2fe1a64b",
     "prev": "bda284fa-b02d-477b-aef0-4f657601a43b",
     "regions": {
      "1b2a4d1e-d031-44a3-bbc1-9bf1eec4743a": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "1c85bcac-de56-40d3-af5e-1e7e027a93d6",
        "part": "whole"
       },
       "id": "1b2a4d1e-d031-44a3-bbc1-9bf1eec4743a"
      }
     }
    },
    "9680f60d-36ba-44a8-a7b3-346e78c97d22": {
     "id": "9680f60d-36ba-44a8-a7b3-346e78c97d22",
     "prev": "592486fc-8781-49d6-8dd9-98be337a53ac",
     "regions": {
      "fe0e6b0d-51db-41c0-a60d-2647fc2b71f0": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "27119a93-4fda-404c-83bd-6e3386797809",
        "part": "whole"
       },
       "id": "fe0e6b0d-51db-41c0-a60d-2647fc2b71f0"
      }
     }
    },
    "ac35ca64-e191-4f31-baa4-6f733df0f593": {
     "id": "ac35ca64-e191-4f31-baa4-6f733df0f593",
     "prev": "3efdf278-db0b-49d5-b075-83118980fb3f",
     "regions": {
      "59aceaa9-ac67-4311-bf30-7fa2ce15ff5f": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "3ae48be8-32df-4c2d-bb66-019b61ae3ffb",
        "part": "whole"
       },
       "id": "59aceaa9-ac67-4311-bf30-7fa2ce15ff5f"
      }
     }
    },
    "af8d078d-38d5-4cbf-940f-7b3298c0ac44": {
     "id": "af8d078d-38d5-4cbf-940f-7b3298c0ac44",
     "prev": "78b54720-eda7-4795-8ce9-8c92cd6917b4",
     "regions": {
      "29c1c343-1842-428a-a803-d6c1f043e676": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "df982e8e-91da-4290-9346-f0877ab6a042",
        "part": "whole"
       },
       "id": "29c1c343-1842-428a-a803-d6c1f043e676"
      }
     }
    },
    "b2eb3ab0-d0f1-4d48-93da-1b3eb8fa4a8a": {
     "id": "b2eb3ab0-d0f1-4d48-93da-1b3eb8fa4a8a",
     "prev": "ce57aaee-9203-4260-b166-ad11713c005f",
     "regions": {
      "9a84b7a0-1ea9-4b3c-80c5-06816df7241a": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "0d5c6005-cfeb-4892-bb07-92f2de2cb98b",
        "part": "whole"
       },
       "id": "9a84b7a0-1ea9-4b3c-80c5-06816df7241a"
      }
     }
    },
    "b466065b-2589-4700-b9ec-f8e6cdbae784": {
     "id": "b466065b-2589-4700-b9ec-f8e6cdbae784",
     "prev": "2eb37443-9459-40ae-b6d3-76d797be45bb",
     "regions": {
      "bb23362c-89bb-4703-a3fb-eac7143cd221": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "712f78bf-e8b4-4b88-a1fc-daf51a09b60c",
        "part": "whole"
       },
       "id": "bb23362c-89bb-4703-a3fb-eac7143cd221"
      }
     }
    },
    "bc0a1c63-55e5-4b4e-b3dc-2661ccbfc278": {
     "id": "bc0a1c63-55e5-4b4e-b3dc-2661ccbfc278",
     "prev": "3549f444-3754-49b3-8568-d0d3d5cb86d0",
     "regions": {
      "c7b938bb-1924-421f-ad98-fa258f60668e": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "7fb2b059-98bf-48b8-b40d-4f2330e74a80",
        "part": "whole"
       },
       "id": "c7b938bb-1924-421f-ad98-fa258f60668e"
      }
     }
    },
    "bda284fa-b02d-477b-aef0-4f657601a43b": {
     "id": "bda284fa-b02d-477b-aef0-4f657601a43b",
     "prev": "075ca6a0-0a22-4236-b1d2-499bed6095d9",
     "regions": {
      "2d348a6d-93ff-4eb9-8ab0-30fda96f2d4b": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "c0be19b4-598e-49af-ba9b-29bfc7284b3c",
        "part": "whole"
       },
       "id": "2d348a6d-93ff-4eb9-8ab0-30fda96f2d4b"
      }
     }
    },
    "c16392bb-f5fe-4417-b6fc-273e88d42cc5": {
     "id": "c16392bb-f5fe-4417-b6fc-273e88d42cc5",
     "prev": "0ef16c18-acdd-43e0-9ac1-44b4a5b52580",
     "regions": {
      "32560681-734f-48f4-8e19-5496843dc8ee": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "65b7d294-59a0-4693-8b1c-c84aa970b03f",
        "part": "whole"
       },
       "id": "32560681-734f-48f4-8e19-5496843dc8ee"
      }
     }
    },
    "c18a52fa-7f67-45d3-bd8b-8db1b9dcb2f0": {
     "id": "c18a52fa-7f67-45d3-bd8b-8db1b9dcb2f0",
     "prev": "0fbf9b25-5cf7-4cf8-9b7d-99648ae86322",
     "regions": {
      "7e2fcbae-e879-46b9-b527-ad981bf7f6ca": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "b7b5a65e-65f6-4d96-983b-6fff6ec36289",
        "part": "whole"
       },
       "id": "7e2fcbae-e879-46b9-b527-ad981bf7f6ca"
      }
     }
    },
    "c679284d-ef3b-4913-ba19-bce758984f1b": {
     "id": "c679284d-ef3b-4913-ba19-bce758984f1b",
     "prev": "e6dfde55-fc8c-41f0-82a0-d2b3b9fc8923",
     "regions": {
      "1fd48cf0-97b7-4691-93f0-8cb37306138e": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "c7e8b795-a3a2-4232-bcb7-4b4737e02aa4",
        "part": "whole"
       },
       "id": "1fd48cf0-97b7-4691-93f0-8cb37306138e"
      }
     }
    },
    "ce57aaee-9203-4260-b166-ad11713c005f": {
     "id": "ce57aaee-9203-4260-b166-ad11713c005f",
     "prev": "100d4dcb-a16f-4770-b888-90e9d4169f0a",
     "regions": {
      "95991d5c-fccf-4b8a-9914-90480d65b6fb": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "cd5ffdba-6e4d-4c09-95f3-abe15d379dd1",
        "part": "whole"
       },
       "id": "95991d5c-fccf-4b8a-9914-90480d65b6fb"
      }
     }
    },
    "d580fa0a-54e0-43b4-b064-8a15eb4e1fbf": {
     "id": "d580fa0a-54e0-43b4-b064-8a15eb4e1fbf",
     "prev": "13c5757b-e27e-4749-b896-086c7e5bd32e",
     "regions": {
      "2c62a6c5-0d54-4e06-a102-3110359a2eab": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "aa0a3b44-b4ab-482c-a8cf-b58284779740",
        "part": "whole"
       },
       "id": "2c62a6c5-0d54-4e06-a102-3110359a2eab"
      }
     }
    },
    "e6dfde55-fc8c-41f0-82a0-d2b3b9fc8923": {
     "id": "e6dfde55-fc8c-41f0-82a0-d2b3b9fc8923",
     "prev": "27d4e307-e004-400c-a74a-d99e9a46bfcc",
     "regions": {
      "19f840ed-c052-4a10-8879-ca6ccc453099": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "6435e1f9-aca2-4265-8ae0-b90ab9d4302a",
        "part": "whole"
       },
       "id": "19f840ed-c052-4a10-8879-ca6ccc453099"
      }
     }
    },
    "faa71446-28df-4d6e-98c8-d9bd842a173e": {
     "id": "faa71446-28df-4d6e-98c8-d9bd842a173e",
     "prev": "af8d078d-38d5-4cbf-940f-7b3298c0ac44",
     "regions": {
      "96d0ada6-02e9-40f3-b0fa-283d350257c5": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "54ee526c-4d39-4b1a-b75f-f61be931c900",
        "part": "whole"
       },
       "id": "96d0ada6-02e9-40f3-b0fa-283d350257c5"
      }
     }
    }
   },
   "themes": {
    "default": "9e4a6687-03a4-4f6d-9dac-c22f2c7c8331",
    "theme": {}
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
