/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * <p>
 * http://www.apache.org/licenses/LICENSE-2.0
 * <p>
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

 {
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "%matplotlib inline\n",
    "\n",
    "import numpy as np\n",
    "import cvxpy as cvx\n",
    "from matplotlib import pyplot as plt"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Nonnegative deconvolution"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x10c8fb990>]"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYQAAAEACAYAAACznAEdAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAFTlJREFUeJzt3X+wXGd93/H3x8gi/AiqaCupsYyx62BbmSHggozjdLqN\nXYGTie1/cByY1MbtP3UyMOkMtcQ/vprJIJxMhjLTuhOmxKiuQRFpiZUZgoUqNjMlMQ7+EXssoaqh\nFrJA1yEmBloGZPLtH/tYXq4l3V1p9+69u+/XzB2dfe5z9jzn2R+fc57zHN1UFZIknTfpBkiSlgcD\nQZIEGAiSpMZAkCQBBoIkqTEQJEnAgIGQZFuSp5I8keT+JKuTrE2yN8mhJA8mWbOg/uEkB5NsGV/z\nJUmjksXuQ0hyEfBF4PKq+mGSPwA+B2wC/qaqfjvJncDaqtqaZBNwP/B2YCOwD/jp8oYHSVrWBjlD\n+A7wQ+A1SVYBrwKOATcCO1udncBNbfkGYFdVvVBVTwOHgc2jbLQkafQWDYSq+jbwu8DX6QXB81W1\nD1hfVfOtznFgXVvlAuBo31Mca2WSpGVs0UBIcgnwm8BFwE/RO1N4L7BwCMghIUlawVYNUOdtwJeq\n6jmAJJ8Ffg6YT7K+quaTbACebfWPARf2rb+xlf2YJAaIJJ2Fqso4nneQawiHgHck+YkkAa4FDgB7\ngNtanVuBB9ryHuCWNhPpYuBS4OFTPXFV+VPFXXfdNfE2LJcf+8K+sC/O/DNOi54hVNVfJvkvwCPA\nj4DHgI8DPwnsTnI7cAS4udU/kGQ3vdA4AdxR494LSdI5G2TIiKr6HeB3FhQ/B1x3mvo7gB3n1jRJ\n0lLyTuVloNPpTLoJy4Z98RL74iX2xdJY9Ma0sW04cSRJkoaUhJrgRWVJ0gwwECRJgIEgSWoMBEkS\nYCBIkhoDQZIEGAiSpMZAkCQBBoIkqTEQJEmAgSBJagwESRJgIEiSGgNBkgQYCJKkxkCQJAEGgrQs\nfOc78N3vTroVmnWLBkKSNyV5LMmj7d/nk7w/ydoke5McSvJgkjV962xLcjjJwSRbxrsL0sr35jfD\n1VdPuhWadUP9Cc0k5wHPAFcBvwH8TVX9dpI7gbVVtTXJJuB+4O3ARmAf8NML/16mf0JTekkCq1fD\nD34w6ZZouVtOf0LzOuCvquoocCOws5XvBG5qyzcAu6rqhap6GjgMbB5BWyVJYzRsIPwK8Km2vL6q\n5gGq6jiwrpVfABztW+dYK5MkLWMDB0KS8+kd/X+mFS0c73H8R5JWsFVD1L0eeKSqvtUezydZX1Xz\nSTYAz7byY8CFfettbGUvMzc3d3K50+nQ6XSGaI4kTb9ut0u3212SbQ18UTnJp4HPV9XO9vhu4Lmq\nuvs0F5WvojdU9AW8qCydkReVNahxXlQeKBCSvBo4AlxSVd9tZa8HdtM7GzgC3FxVf9t+tw34V8AJ\n4ANVtfcUz2kgSI2BoEFNPBDGsmEDQTrJQNCgltO0U0nSlDIQJEmAgSAtG46gatIMBEkSYCBIkhoD\nQZIEGAiSpMZAkCQBBoIkqTEQJEmAgSBJagwESRJgIEiSGgNBkgQYCJKkxkCQJAEGgiSpMRAkSYCB\nIElqBgqEJGuSfCbJwSRPJbkqydoke5McSvJgkjV99bclOdzqbxlf8yVJozLoGcLHgM9V1RXAzwJf\nBbYC+6rqMmA/sA0gySbgZuAK4HrgniRj+YPQkqTRWTQQkrwO+KdVdS9AVb1QVc8DNwI7W7WdwE1t\n+QZgV6v3NHAY2DzqhkuSRmuQM4SLgW8luTfJo0k+nuTVwPqqmgeoquPAulb/AuBo3/rHWpmkZeT3\nfg/e/e5Jt0LLyaoB61wJ/HpVfSXJR+kNFy38k+BD/4nwubm5k8udTodOpzPsU0g6S5/8JDz00KRb\nocV0u1263e6SbCtVZ/4eT7Ie+POquqQ9/nl6gfCPgU5VzSfZAHyxqq5IshWoqrq71f88cFdVfXnB\n89Zi25ZmRQLnnw8//OHSbfPqq3uB4MdwZUlCVY3luuyiQ0ZtWOhokje1omuBp4A9wG2t7Fbggba8\nB7glyeokFwOXAg+PstGSpNEbZMgI4P3A/UnOB74GvA94BbA7ye3AEXozi6iqA0l2AweAE8AdngpI\ni/NToklbdMhobBt2yEg6KYFVq+DEiaXbpkNGK9NEh4wkSbPBQJAkAQaCJKkxECRJgIEgSWoMBGlG\n+V9OaiEDQZIEGAiSpMZAkJYJh3A0aQaCVrRrroFHHpl0K6TpYCDonH3/+3DttZPZ9p/9GezbN5lt\nj5r/hYQmzUDQOfvGN2D//km3QtK5MhAkSYCBIElqDARJEmAgSJIaA0GSBBgIkqTGQNCK5/x9aTQG\nCoQkTyf5yySPJXm4la1NsjfJoSQPJlnTV39bksNJDibZMq7GS5JGZ9AzhL8DOlX11qra3Mq2Avuq\n6jJgP7ANIMkm4GbgCuB64J7E/6VlmvnqStNh0EDIKereCOxsyzuBm9ryDcCuqnqhqp4GDgObkXRG\nDn1p0gYNhAK+kOQvkvzrVra+quYBquo4sK6VXwAc7Vv3WCuTJC1jqwasd01VfTPJPwT2JjlELyT6\nDX18Mzc3d3K50+nQ6XSGfQpJmmrdbpdut7sk2xooEKrqm+3fv07yR/SGgOaTrK+q+SQbgGdb9WPA\nhX2rb2xlL9MfCJKkl1t4sLx9+/axbWvRIaMkr07y2rb8GmAL8CSwB7itVbsVeKAt7wFuSbI6ycXA\npcDDI263pHPkZAAtNMgZwnrgs0mq1b+/qvYm+QqwO8ntwBF6M4uoqgNJdgMHgBPAHVVeLpOk5W7R\nQKiq/wO85RTlzwHXnWadHcCOc26dVgTjXpoO3qksSQIMBI2AY9HSdDAQpGXCYNWkGQiSJMBAkCQ1\nBoK0TDhbS5NmIEiSAANBmllexNZCBoJWPIdazo79poUMBEkSYCBoBBx6kKaDgSBJAgwESVJjIEiS\nAANBktQYCJIkYEoD4T3vgQ9/eNKtmB2Tns/uLCdpNKYyED79abj33km3Qktl0oE0Kku9HwapFprK\nQJAkDW/gQEhyXpJHk+xpj9cm2ZvkUJIHk6zpq7styeEkB5NsGUfDtXx4pClNh2HOED4AHOh7vBXY\nV1WXAfuBbQBJNgE3A1cA1wP3JH5lSNJyN1AgJNkI/CLwn/uKbwR2tuWdwE1t+QZgV1W9UFVPA4eB\nzSNprSRpbAY9Q/go8EGg/7LX+qqaB6iq48C6Vn4BcLSv3rFWJklaxlYtViHJLwHzVfV4ks4Zqg49\nR2Jubu7kcqfTodM509MPZ1pmnkiabd1ul263uyTbWjQQgGuAG5L8IvAq4CeT3AccT7K+quaTbACe\nbfWPARf2rb+xlb1MfyBIs84rbTqVhQfL27dvH9u2Fh0yqqoPVdUbquoS4BZgf1X9GvDHwG2t2q3A\nA215D3BLktVJLgYuBR4eecslSSM1yBnC6XwE2J3kduAIvZlFVNWBJLvpzUg6AdxR5QCOxsd319nx\njEQLDRUIVfWnwJ+25eeA605Tbwew45xbJ0laMt6prHPmkeZoeKajSTMQpBllAGkhA0GSBBgIkqTG\nQJAkAQaCRmDSY9Fe1JZGw0CQJAEGgqbApM9QpGlhIEgzyqE2LTS1geBR49Lxi0WaDlMbCJKk4RgI\nkiTAQJCWDYc5NWkGgiQJMBAkSc3UBoIzXyRpOFMbCI7Hzg5fa2k0pjYQJEnDMRB0zhyeW5l83bTQ\nooGQ5JVJvpzksSRPJflwK1+bZG+SQ0keTLKmb51tSQ4nOZhkyzh3QJoWfkFr0hYNhKr6AfDPq+qt\nwJuBX0hyDbAV2FdVlwH7gW0ASTYBNwNXANcD9yS+1SVpuRtoyKiq/l9bfGVb59vAjcDOVr4TuKkt\n3wDsqqoXqupp4DCweVQNliSNx0CBkOS8JI8Bx4FuVR0A1lfVPEBVHQfWteoXAEf7Vj/WyjSlJj3L\nx/PPszPp103Lz6pBKlXV3wFvTfI64MEkHWDh22not9fc3NzJ5U6nQ6fTGfYpTss3u6Rp0O126Xa7\nS7KtgQLhRVX1nSSfA94GzCdZX1XzSTYAz7Zqx4AL+1bb2Mpepj8QpFnnQYxOZeHB8vbt28e2rUFm\nGf2DF2cQJXkV8C+Ax4A9wG2t2q3AA215D3BLktVJLgYuBR4ecbulk/wilUZjkDOEfwTsbDOFzgPu\nq6r/0a4p7E5yO3CE3swiqupAkt3AAeAEcEeVH1lJWu4WDYSqehK48hTlzwHXnWadHcCOc26dVgQv\n6krTwTuVpRllkGuhqQ0E3+ySNJypDQSvWkjScKY2ECRJwzEQJEmAgSBJagwErXheL5JGw0CQJAEG\ngkbAKb6j4ZmOJm1qA8EPlyQNZ2oDQUvH8F2ZPLPTQgaCVjy/2KTRMBAkSYCBIC0bnulo0qY2EPxw\nSdJwpjYQvNA5O3ytz479poWmNhAkScMxEHTOHJ6TpoOBIEkCBgiEJBuT7E/yVJInk7y/la9NsjfJ\noSQPJlnTt862JIeTHEyyZZw7IE0Lx/Q1aYOcIbwA/Nuq+hngauDXk1wObAX2VdVlwH5gG0CSTcDN\nwBXA9cA9iYMK0nLjp1ILLRoIVXW8qh5vy98DDgIbgRuBna3aTuCmtnwDsKuqXqiqp4HDwOYRt1uS\nNGJDXUNI8kbgLcBDwPqqmodeaADrWrULgKN9qx1rZUvK029JGs6qQSsmeS3wh8AHqup7SRZ+5Q79\nFTw3N3dyudPp0Ol0hn0KSZpq3W6Xbre7JNsaKBCSrKIXBvdV1QOteD7J+qqaT7IBeLaVHwMu7Ft9\nYyt7mf5AkM6WZ4OaZgsPlrdv3z62bQ06ZPT7wIGq+lhf2R7gtrZ8K/BAX/ktSVYnuRi4FHh4BG2V\nJI3RomcISa4B3gs8meQxekNDHwLuBnYnuR04Qm9mEVV1IMlu4ABwArijymO4aeZsFWk6LBoIVfUl\n4BWn+fV1p1lnB7DjHNp1zvySWjrGvTQdvFNZK57hL43G1AaCR62SNJypDQRJZ+aZlRYyECRJgIEg\nSWoMBK14Xi+SRsNAkCQBBoJGwIuT0nSY2kBwGEE6Mz8jWmhqA0GSNBwDQZIEGAiSpGZqA8ELndKZ\n+RnRQlMbCJKk4RgIWvGcLSONxtQGgl8SkjScqQ0ESdJwDASteF4clUZj0UBI8okk80me6Ctbm2Rv\nkkNJHkyypu9325IcTnIwyZZxNVySNFqDnCHcC7xzQdlWYF9VXQbsB7YBJNkE3AxcAVwP3JN4/CZJ\nK8GigVBV/xP49oLiG4GdbXkncFNbvgHYVVUvVNXTwGFg82iaKkkap7O9hrCuquYBquo4sK6VXwAc\n7at3rJVJkpa5UV1UXnaTPJ12Kp2Zg7laaNVZrjefZH1VzSfZADzbyo8BF/bV29jKTmlubu7kcqfT\nodPpnGVzNMsMf02zbrdLt9tdkm0NGghpPy/aA9wG3A3cCjzQV35/ko/SGyq6FHj4dE/aHwhauTzS\nlMZn4cHy9u3bx7atRQMhyaeADvD3k3wduAv4CPCZJLcDR+jNLKKqDiTZDRwATgB3VE3m+M0vKUka\nzqKBUFXvOc2vrjtN/R3AjnNplCRp6XmnsiQJMBAkSc3UBoIzT6Qz8zOihaY2ECRJwzEQJEmAgaAp\n4NDH2XFqthYyECRJgIGgKeCRrjQaBoIkCZjiQHBcWZKGM7WBIEkaztQGguPKkjScqQ0ESdJwDARJ\nEmAgaAo4geDsOKyqhQwEnTO/WKTpMLWB4FGjJA1nagNBkjQcA0GSBIwxEJK8K8lXk/yvJHeOazuS\npNEYSyAkOQ/4D8A7gZ8BfjXJ5ePY1jTodruTbsKyYV+8xL54iX2xNMZ1hrAZOFxVR6rqBLALuHFM\n21rxfLO/xL54iX3xEvtiaYwrEC4AjvY9fqaVSZKWqVWT3Pgv//L4nvuZZ8b7/KN06BA88sikW3H2\nvv/93r+j6O+z6Yvf+i34ylfOfdvLQX8fjvt98cUvvnyby9VK/4ysFKkxTNhP8g5grqre1R5vBaqq\n7u6r450CknQWqmost4OOKxBeARwCrgW+CTwM/GpVHRz5xiRJIzGWIaOq+lGS3wD20rtO8QnDQJKW\nt7GcIUiSVp6J3Kk87TetJdmYZH+Sp5I8meT9rXxtkr1JDiV5MMmavnW2JTmc5GCSLX3lVyZ5ovXV\nv5/E/oxCkvOSPJpkT3s8k32RZE2Sz7R9eyrJVTPcF9taHzyR5P4kq2elL5J8Isl8kif6yka2760v\nd7V1/jzJGwZqWFUt6Q+9EPrfwEXA+cDjwOVL3Y4x7+MG4C1t+bX0rqdcDtwN/LtWfifwkba8CXiM\n3hDeG1v/vHj29mXg7W35c8A7J71/Z9knvwn8V2BPezyTfQF8EnhfW14FrJnFvmif/68Bq9vjPwBu\nnZW+AH4eeAvwRF/ZyPYd+DfAPW35V4BdA7VrAh3xDuBP+h5vBe6c9As05n3+I+A64KvA+la2Afjq\nqfoA+BPgqlbnQF/5LcB/mvT+nMX+bwS+AHR4KRBmri+A1wF/dYryWeyLtW2/17Yvuj2z9hmhF4r9\ngTCyfQc+D1zVll8B/PUgbZrEkNFM3bSW5I30jgQeovdizwNU1XFgXau2sE+OtbIL6PXPi1ZqX30U\n+CDQf8FqFvviYuBbSe5tw2cfT/JqZrAvqurbwO8CX6e3X89X1T5msC/6rBvhvp9cp6p+BPxtktcv\n1gD/t9MxSvJa4A+BD1TV9/jxL0RO8XjqJPklYL6qHgfONHd66vuC3pHwlcB/rKorgf9L7+hvFt8X\nl9AbRrwI+CngNUneywz2xRmMct8Hum9hEoFwDOi/wLGxlU2VJKvohcF9VfVAK55Psr79fgPwbCs/\nBlzYt/qLfXK68pXkGuCGJF8DPg38QpL7gOMz2BfPAEer6sX7qv8bvYCYxffF24AvVdVz7Qj2s8DP\nMZt98aJR7vvJ37X7wl5XVc8t1oBJBMJfAJcmuSjJanrjXnsm0I5x+31643sf6yvbA9zWlm8FHugr\nv6XNDLgYuBR4uJ02Pp9kc5IA/7JvnRWhqj5UVW+oqkvovdb7q+rXgD9m9vpiHjia5E2t6FrgKWbw\nfUFvosU7kvxE24drgQPMVl+EHz9yH+W+72nPAfBuYP9ALZrQxZR30XtDHAa2Tvrizhj27xrgR/Rm\nUD0GPNr2+fXAvrbve4G/17fONnqzBw4CW/rK/wnwZOurj016386xX/4ZL11Unsm+AH6W3kHR48B/\npzfLaFb74oP0AvEJYCe9WYcz0RfAp4BvAD+gdx3lffQusI9k34FXArtb+UPAGwdplzemSZIALypL\nkhoDQZIEGAiSpMZAkCQBBoIkqTEQJEmAgSBJagwESRIA/x8sHdf31+NUeQAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x10c8fbfd0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "np.random.seed(0)\n",
    "n = 10000\n",
    "sigma = n/10\n",
    "k = 5\n",
    "\n",
    "x0 = np.zeros(n)\n",
    "x0[np.random.choice(n,k)] = np.random.rand(k)*n/10\n",
    "plt.plot(x0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x109f93790>]"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\nSUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x10c91efd0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "c = np.exp(-np.arange(-n/2., n/2.)**2./(2*sigma**2))/np.sqrt(2*sigma**2*np.pi)\n",
    "c[c < 1e-6] = 0\n",
    "plt.plot(c)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x10751e0d0>]"
      ]
     },
     "execution_count": 65,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x107515890>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "b = np.convolve(c, x0) \n",
    "b += np.linalg.norm(b)/20/np.sqrt(2*n-1)*np.random.randn(2*n-1)\n",
    "plt.plot(b)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "----------------------------------------------------------------------------\n",
      "\tSCS v1.2.6 - Splitting Conic Solver\n",
      "\t(c) Brendan O'Donoghue, Stanford University, 2012-2016\n",
      "----------------------------------------------------------------------------\n",
      "Lin-sys: sparse-indirect, nnz in A = 816002, CG tol ~ 1/iter^(2.00)\n",
      "eps = 1.00e-03, alpha = 1.50, max_iters = 2500, normalize = 1, scale = 1.00\n",
      "Variables n = 1001, constraints m = 3001\n",
      "Cones:\tlinear vars: 1000\n",
      "\tsoc vars: 2001, soc blks: 1\n",
      "Setup time: 4.53e-02s\n",
      "----------------------------------------------------------------------------\n",
      " Iter | pri res | dua res | rel gap | pri obj | dua obj | kap/tau | time (s)\n",
      "----------------------------------------------------------------------------\n",
      "     0| 1.22e+00  8.17e-01  9.22e-01 -1.16e+01  2.51e-01  3.49e-15  7.49e-02 \n",
      "   100| 1.94e-03  5.57e-06  1.58e-05  2.29e-01  2.29e-01  1.39e-15  2.84e+00 \n",
      "   200| 8.96e-04  3.02e-06  3.95e-05  2.29e-01  2.29e-01  1.39e-15  5.57e+00 \n",
      "----------------------------------------------------------------------------\n",
      "Status: Solved\n",
      "Timing: Solve time: 5.57e+00s\n",
      "\tLin-sys: avg # CG iterations: 10.08, avg solve time: 2.75e-02s\n",
      "\tCones: avg projection time: 4.08e-06s\n",
      "----------------------------------------------------------------------------\n",
      "Error metrics:\n",
      "dist(s, K) = 4.0485e-16, dist(y, K*) = 0.0000e+00, s'y/|s||y| = 8.2313e-17\n",
      "|Ax + s - b|_2 / (1 + |b|_2) = 8.9635e-04\n",
      "|A'y + c|_2 / (1 + |c|_2) = 3.0178e-06\n",
      "|c'x + b'y| / (1 + |c'x| + |b'y|) = 3.9507e-05\n",
      "----------------------------------------------------------------------------\n",
      "c'x = 0.2293, -b'y = 0.2294\n",
      "============================================================================\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x107840050>]"
      ]
     },
     "execution_count": 71,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1073e3590>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "x = cvx.Variable(n)\n",
    "f = cvx.sum_squares(cvx.conv(c, x) - b)\n",
    "prob = cvx.Problem(cvx.Minimize(f), [x >= 0])\n",
    "prob.solve(solver=cvx.SCS, verbose=True)\n",
    "plt.plot(x.value)\n",
    "plt.plot(x0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x10842cf50>]"
      ]
     },
     "execution_count": 73,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYYAAAEACAYAAAC3adEgAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3XmAzfX+x/Hne5jFjD2ibNEUMYQytLkTWSLpaqNbSYqK\n1qvQxm37pV0p3bbbjvaUZSRGJdkpsiaMJRFZhmGWz+8PQzMa61m+Z3k97j33nnPme76f13ydmdd8\n12POOURERPaJ8TqAiIiEFhWDiIgUoWIQEZEiVAwiIlKEikFERIpQMYiISBF+KQYza29mi81sqZn1\nP8g0aWY218wWmNlkf4wrIiL+Z76ex2BmMcBSoDWwDpgJdHXOLS40TTnge6Ctc26tmVVyzm3yaWAR\nEQkIf6wxpALLnHOrnHM5wEig8wHTXAV87JxbC6BSEBEJXf4ohmpAZqHHawqeK+xUoKKZTTazmWZ2\njR/GFRGRACgZxHGaAq2AJGCamU1zzi0P0vgiInKE/FEMa4GahR5XL3iusDXAJudcNpBtZt8ApwN/\nKwYz08WbRESOknPO/DUvf2xKmgkkm1ktM4sDugKjD5jmc+BcMythZolAc2DRwWbonNPND7dBgwZ5\nniGSblqeWp6hevM3n9cYnHN5ZtYXmMDeonndObfIzHrv/bJ7xTm32MzSgR+BPOAV59zPvo4tIiL+\n55d9DM658UDdA5777wGPnwKe8sd4IiISODrzOYKlpaV5HSGiaHn6l5Zn6PL5BDd/MzMXaplEREKZ\nmeFCbOeziIhEEBWDiIgUoWIQEZEiVAwiIlKEikEkwmTtySI3P9frGBLGVAwiEWLKyimcPrwJxw2p\nzHFDKjFo8iAVhBwTHa4qEgE+WPghN3x8K/lfvMTJOZewemsm8Zf35KzGFfm420hiTH8DRjIdrioi\nRcxaN4seH/ahylfpzHmvC/PnxbB2YS06bBnL19PX8/Dkx72OKGFGawwiYSxrTxbJTzXFJj/MglFX\nULHiX19zDjpfs4avTm7Mgtunc3LFk70LKgGlNQYR2e+BcU+x+efGjH+6aCkAmMG7L1UndmY/eo66\n25uAEpZUDCJhav329bw463luPmUIjRoVP03ZsvD0FbfxfeZUFv6uCxrLkdGmJJEw9c9X+zBpQil+\ne/spSpU6+HT5+VDlskc5o+1yxt/0v+AFlKDRpiQRYWPWRr5c9T4Pte93yFIAiImB+9r35uu1n7I1\ne2twAkpYUzGIhKGBn75EworLuOXaqkc0/c3dKxGzsg3DpowIcDKJBCoGkTCTnZvNO4tf4s4W/yY2\n9sheEx8P7Y/vyUs/vBHYcBIRVAwiYeblKZ/i1p/OwBvrHdXrHvjXBfy2ayUrNq8MTDCJGCoGkTDz\n3JTXaVOp52H3LRzozKYlKbu+M0MnfBKYYBIxVAwiYWTJ77+yes98Hu9+yTG9/sJaXfj4ZxWDHJqK\nQSSMDPzgDar9cRUN68cf0+vvvKQ163N/Zt229X5OJpFExSASJvJdPuPWvcUtZ/U85nmc2SSOUuva\n8FpGuh+TSaRRMYiEibE/TmPP9rLcduVBTnM+AmZwVpW2fDxvgh+TSaTxSzGYWXszW2xmS82sfzFf\n/4eZ/Wlmcwpu9/tjXJFo8uS4UaTYlSQl+Tafq89qw6LdX5Hv8v0TTCKOz8VgZjHAMKAd0ADoZmbF\nHUf3jXOuacHtEV/HFYkmefl5TNv6IX3TrvB5Xpe1qUnu9kpM/WWeH5JJJPLHGkMqsMw5t8o5lwOM\nBDoXM53fruMhEm1GTvuW/B1VuK5TXZ/nlZQE1Xa15bUMbU6S4vmjGKoBmYUeryl47kBnmdk8Mxtj\nZvX9MK5I1Hj+6w9olnDlEZ/pfDitTrqASb9O9M/MJOKUDNI4s4GazrmdZnYh8Blw6sEmHjx48P77\naWlppKWlBTqfSMjKzc9lzq6PeeeCaX6bZ4/W5/Lul1eRk5dDbAk/tY0ETUZGBhkZGQGbv8+X3Taz\nFsBg51z7gscDAOecG3KI1/wKnOGc21zM13TZbZFCRv3wDVe/ezvZQ+dSooR/5pmXB3G3N2LsTa/T\nLqWZf2YqngnFy27PBJLNrJaZxQFdgdGFJzCzKoXup7K3kP5WCiLyd8MnjaZhfGe/lQJAiRJQPf9c\nRn7/rf9mKhHD52JwzuUBfYEJwEJgpHNukZn1NrNeBZNdZmYLzGwu8Bxwpa/jikQD5xzTt37OdS0u\n9vu8W5x4Ht+t/s7v85Xwp09wEwlh3y5exD9ea8vOR1aTkODfA/s++iqTbpPPYM+jGzDTQYPhLBQ3\nJYlIgDw7djQn517s91IAuOi8GuRlJzI3c6nf5y3hTcUgEsImrxvN5Y38vxkJICEBKu08l/e+1eYk\nKUrFIBKilq3bwJ+xC7nrn2kBG+P0Ss3JWDYjYPOX8KRiEAlRz3w5hqpZbalU4dgusX0k2tRvxvKd\nMwM2fwlPKgaREDX2l9G0rRWYzUj7XH5eY7bFLWbnnl0BHUfCi4pBJATtyskms+Qk+ra/MKDj1K6R\nQOyfpzF2ri6oJ39RMYiEoLczviNuawOaNTgu4GNVt1S+mKP9DPIXFYNICHp/ejqnJ7YPylhNqzZj\nxhrtZ5C/qBhEQtDsreO54ox2QRmrfcNUVuZojUH+omIQCTFL1q0lq8Q6buwQnIvbdTnvNLJj17Nx\n+5agjCehT8UgEmJeGJdOlawLKFvGj1fNO4SKFUpQ6s8mfDp9dlDGk9CnYhAJMeOWpZNWPTj7F/ap\nGdeEiT/ND+qYErpUDCIhJDcvj5UxX9H7grZBHbdJ1cbM/31uUMeU0KViEAkhH02bSYms6qQ1Le7T\ncQOnVf3GZObqXAbZS8UgEkL+9+14TotrR7Cvgt2pRX12xa8ga7fOgBYVg0hImf5HOl0aBnf/AkDV\nyvHEbj+V8XMWBn1sCT0qBpEQseaPzWyNW8jNHc/1ZPyqNGbCj9rPICoGkZDx4riJVNzekuOPC9zV\nVA+lQcXGzFqj/QyiYhAJGZ8vHM85VYNztnNxzk1uzIpdKgZRMYiEBOccS/PT6fmP4O9f2Kdz88Zs\njf+RvPw8zzJIaFAxiISAcbMXQE4Cnc5O9ixDg5PLY7sqMW3JL55lkNCgYhAJAa9lpJNs7YiJCfJx\nqoWYwXE5jflytnZARzsVg0gI+Hb9eDqd5t1mpH1OLtOI6b/+5HUM8ZhfisHM2pvZYjNbamb9DzFd\nMzPLMbMu/hhXJBJs3p7FpoTp9Ol4vtdRSK3VkCV/qhiinc/FYGYxwDCgHdAA6GZm9Q4y3eNAuq9j\nikSS4eMzKLv9TE46oYzXUWjdsCGbbIHXMcRj/lhjSAWWOedWOedygJFA52KmuxX4CPjdD2OKRIyP\n56XT7DjvDlMt7IKmJ5OTsJ6NW3d4HUU85I9iqAZkFnq8puC5/czsROAS59xwwLu9ayIhaOHu8Vx3\njvf7FwASE0qSsKMeY2fp0hjRrGSQxnkOKLzv4ZDlMHjw4P3309LSSEtLC0goEa99t3AFOTHbuDKt\nkddR9qsa05ApixbQvXVzr6PIQWRkZJCRkRGw+ZtzzrcZmLUABjvn2hc8HgA459yQQtOs2HcXqARk\nAb2cc6OLmZ/zNZNIuLj6ueFMXf0Dvz7zltdR9rvwkSf5fddaZj/6nNdR5AiZGc45v22N8cempJlA\nspnVMrM4oCtQ5Be+c65Owa02e/cz3FJcKYhEm0mr02mfHBr7F/ZpflJDVu7SkUnRzOdicM7lAX2B\nCcBCYKRzbpGZ9TazXsW9xNcxRSJBVvYe1idMpm+HNl5HKaJdkxT+jNWRSdHML/sYnHPjgboHPPff\ng0x7vT/GFAl3b0yYRuLOU2lwUmWvoxTR/LRq5MfsYcma36lb/Xiv44gHdOaziEdGzBpPk7KhcTRS\nYTExRpmdDRk7S5uTopWKQcQj87an061ZaO1f2KdGfApTl6sYopWKQcQDP63YQHbCr/Rs18LrKMVq\nULkhCzdqP0O0UjGIeGDYuAmcsLsVCXHBOpXo6Jx3akPW5GiNIVqpGEQ8kL5iPK1rhd7+hX06nNmA\nHaUWkpef73UU8YCKQSTIcnLzWV3yK/q0C839CwAnV6tAzJ4KTFu00uso4gEVg0iQvTdpDnG5lWhe\nr6bXUQ6pYk5D0udqc1I0UjGIBNk709JJSQjdtYV9TkpMYfpKFUM0UjGIBNnMzeO5rEno7l/Yp/GJ\nKSzdoqusRiMVg0gQ/bpuK9tLz+Om9i29jnJYafUb8pvTIavRSMUgEkQvjPmayrvOoXzpUl5HOawL\nz6zH7sTlZGXv8TqKBJmKQSSIxixOp+WJob9/AaBi2VLE7qrJ13OXeR1FgkzFIBIkeXmO5TaeXq1D\nf//CPpVdCl8v0OakaKNiEAmS0d8vISYG2jSu53WUI5ZcNoU5a1QM0UbFIBIkr08ZT90S7TALn489\nP7NGCsu36ZDVaKNiEAmS738fzyUp4bMZCaBVwxQ2xWiNIdqoGESC4Lc/drGlzFT6dGjtdZSj0ur0\nZHJLreX3LVleR5EgUjGIBMFLY76hfHZjTqhQzusoR6VUfCwJO09l3KxFXkeRIFIxiATBpz+lc1bl\n8DhM9UBVY1L4ZrE2J0UTFYNIgDkHi3PGc33L8Nq/sE+9CinMX69iiCYqBpEA+3r2avJLbeSfLZp6\nHeWYNK/dkJU7VQzRRMUgEmCvTEynjmtLiZjw/HFrc3oKW2JVDNEkPN+pImEkY+14OtYNz/0LAC1O\nq0l+3FaWr9nidRQJEr8Ug5m1N7PFZrbUzPoX8/WLzWy+mc01s1lm1sof44qEuj+35bCx9CT6XtjW\n6yjHrERMDKV3NmDcbF2CO1r4XAxmFgMMA9oBDYBuZnbgOf8TnXOnO+eaAD2AV3wdVyQcvDJ2OqVz\nTiK5alWvo/ikelwKU5dpc1K08McaQyqwzDm3yjmXA4wEOheewDm3s9DD0sAmP4wrEvI+nJPOmeXD\n82ikwupXSmHB7yqGaOGPYqgGZBZ6vKbguSLM7BIzWwSMBW7zw7giIc05+GnXeK4+K3z3L+xzdnIK\nmbtVDNGiZLAGcs59BnxmZucC7wB1Dzbt4MGD999PS0sjLS0t0PFE/G76TxvZU3YpV//jbK+j+Kx9\n0xTunv4T+fmOmJjwuQhgpMrIyCAjIyNg8zfnnG8zMGsBDHbOtS94PABwzrkhh3jNL0Cqc+6PYr7m\nfM0kEgquffJ9pvwxilWPf+51FJ855ygxsDIzevzEmXVP8DqOHMDMcM75rbH9sSlpJpBsZrXMLA7o\nCowuPIGZnVzoflOA4kpBJJJ8vWo87eqE//4F2PuLp/yeFNLnaHNSNPC5GJxzeUBfYAKwEBjpnFtk\nZr3NrFfBZJea2QIzmwMMBa70dVyRULYjK5/1iRPo0z789y/sUyuhIT/8qmKIBn7Zx+CcG88B+wyc\nc/8tdP8J4Al/jCUSDv43dj4JVpbTa9bxOorfNKyawverZngdQ4JAZz6LBMCImek0Lh05awsALeum\nsD5XawzRQMUgEgBzd4ynW2pk7F/Y58IzG7Cz9EL25OR7HUUCTMUg4mdzF21jd4XZ9Iiww6yrHVee\nEjkV+Gb+Kq+jSICpGET8bNjYrzgx72xKxyd5HcXvjstLYeJP2pwU6VQMIn6WvmIMbWp38DpGQNRJ\nSmHmShVDpFMxiPhR1s581iWO49Z2Hb2OEhBNqqewbKuKIdKpGET86I1xc0mwsjQ9KdnrKAGRVj+F\nDagYIp2KQcSP3p8xliZlInMzEkC7pqexp/RStu3I8TqKBJCKQcSP5u0cwzXNI3MzEkC5xETidldn\nwuxlXkeRAFIxiPjJjIUb2V1mEdedf57XUQLqeNeQyQu1OSmSqRhE/OT5seOpmdeKhNh4r6ME1Cnl\nUpizVsUQyVQM4pn8fNi2DXbt8jqJf0xcOZaL6kbuZqR9mtVKYcV2FUMkC9oH9YgArFoFr474jZGz\nxrEqbwauzBpcbklK5yTzj2ptefTGVjRsUMLrmEftjy25bCiTzh0dn/Y6SsBd0CiFp+epGCKZikGC\n4uef4Y6np5Kx+zliTv6a5mkX0CvlPOpWbc/u3BymLlnMhwsG0OTVHVwY8wwfPtaRhASvUx+5YZ9P\no2x+LZKrnOh1lIBr2eAU8hIzWbdxFydWLuV1HAkAnz/Bzd/0CW6RZcsWuOM/Kxi5uR9JyXO5N60f\nvZtfS5n4Mn+b1jnHR/PS6fHRLSRmXszs/3uSGtViPUh99FLuGEiNaiUYd/cjXkcJiqR+jRja6k1u\n6NDU6yhCaH6Cm8jf5OXB8y/voHr3exlVrhn9rjqTdfcuol/LPsWWAux9c1/epD2r75tN2ZMXUf/B\nbqzM3BPk5EcvNxcW542hd6vI37+wzwklUvh2sTYnRSoVg/jdd1PzObnLu9y9qh5pnVfzy79/5NH2\n95JQ8si2DVVMrMDC+0ZTreYeznioB1lZob0G+fGkFVjpDXRqkup1lKCpVzGF+etVDJFKxSB+89tv\n0LHXDFq9dw4xZz3HpJs/YEzPd6lWttpRzyu+ZDxzBo7CKi2lxT3/RyhvXfxvxuc0jLuYEjHht9P8\nWJ2dnMLKXT95HUMCRMUgPsvOhgefXMdJd3RnygmXMPSaXizvP4Nzap7t03wT40ox467PWVxmGP2H\nZ/gnbAD8sPVzrm7W2esYQdUp9XS2lZpPXp7XSSQQVAxyzPbsgSEv/kblf/Xj8W0NubbLiay/dwk3\nn9WDGPPPW6tO5RMZ2vo1nv7lOub+vNUv8/SnGQs2kV1uLr3btPY6SlClVK+JxWYzdf5vXkeRAFAx\nyFHLy4NnX19D5Wtv4/719enQKYcVd8/nlSv+76A7ln1xS5sONK94IR1fuDPkNik98+UYauVfQFJ8\ndB22aWYcl9OEL2fP9TqKBICKQY5Yfj4Me3clla67iXt+bUSHtvFkDviZUdcNpXrZ6gEde8wdT7Cp\n3AQe+t/UgI5ztL5a/RmXNbjE6xieqFu2CdN+VTFEIhWDHJZz8PrHK6l8fS/uWHQG7VpWZO2AJYy4\n/kmqlq4alAwVkspwX7OneHReH7ZszQ3KmIfzy+qdbC4/iX9fHD2HqRZ21klNWbJNxRCJ/FIMZtbe\nzBab2VIz61/M168ys/kFt+/MrKE/xpXA+2bOBqrd1Ives8+kVfMqbLhvGSNvfIzjS1cOepYHu1zJ\ncYkV6frkf4M+dnGe+GgiVfLOoGq5il5H8USnZk34I3ZuyG3eE9/5XAxmFgMMA9oBDYBuZlbvgMlW\nAC2dc6cDjwCv+jquBNau7DzaPDCUtA9SqF+nHOvvXcqHNz/McYne/RI0M97s+ixf7XmYpSu3e5Zj\nn9FLP6NjcnQdjVTY2aeeikv6jQXLQ++gAPGNP9YYUoFlzrlVzrkcYCRQ5KfFOfeDc27fu+cH4OgP\nbJegmfrTGqrc04o5Oz8h49pvmNj/SSqXDo2/its1Pp168a256oVnPc2xbsMeNpT/nP6duniaw0sl\nYkpQbndDRk+f73UU8TN/FEM1ILPQ4zUc+hf/DcA4P4wrATB09GRavnsm553Yjg1PTKJl/dO8jvQ3\n717/MHPihjJt/kbPMgz5cCIV80/j1Ko1PMsQCuqUasK3y7SfIdIE9eqqZnY+0AM491DTDR48eP/9\ntLQ00tLSAppL9rrzjREMXXI7jzcbyT2XtfI6zkE1rV2H5ond6P76Yyx93ps1h48Xj6Jj/Ss8GTuU\nNK/ZlC/mf+d1jKiTkZFBRkZGwObv89VVzawFMNg5177g8QDAOeeGHDBdI+BjoL1z7pdDzE9XV/XA\nHf97hxd+HsiIi8ZxxT9C/9iAFRs2kPxcfb66dB6tzwzuX+1rN+ym+nNVWXLbQk49IfIvs30oo2fN\n5tK3e5Dz/I9eR4lqoXh11ZlAspnVMrM4oCswuvAEZlaTvaVwzaFKQbwxeNQnvLDoHkZ1/CosSgGg\nTpUqtEy6kd7vPhr0sR8ZkU7lvEZRXwoAbU9PIbfscjLXZ3sdRfzI52JwzuUBfYEJwEJgpHNukZn1\nNrNeBZM9AFQEXjKzuWY2w9dxxT8+mT6Th+b25uWWY7gsLfT2JxzKm73uZkXCR0yYuSKo4368+AO6\n1L0yqGOGqoTYeJJ2n8Jn3+tKq5FEH9QTxX75bQP1nmlGzxOf5+U7wvPs3dYPD+bXLStZ8cybQRlv\n8S87qf9aNVbds5gaFaoEZcxQ1+iBnpwU24zRD97kdZSoFYqbkiQM5eXncfYzXWmUd33YlgLAmzfd\nycq4MYybuSQo4w0a8SnVaaFSKOSsmqnM26iNAJFExRClrhn+DDuy8pny0ANeR/FJjcrlaJ14FzeP\nGhzwsZyDMevepOcZPQI+Vjj5Z7NU1sVM1xnQEUTFEIXGz5vPyMwnGNXtLUonhf+Hy7x5862sjpnM\n6OmB/eCYMd+tZle5Odx98cUBHSfctEpJIb/MKhYs2+Z1FPETFUOUycnL5Yr3r+OSxCe56NyTvI7j\nF9Uql6Z9mXvo8+GggI4z+LO3ObPUlSTGHdlHlEaLuJKxVNjdmA+/m+11FPETFUOU6f36i+TtqMCI\n/t29juJXb/a5mXU2nQ+nBuaX07Ztjrl5b/HgxdcFZP7h7rRyqUxaNt3rGOInKoYosuy3dbz168MM\nv+gl4uP9dgBDSDi+YikurnAft336YEDmP+jtr0lKSKDD6c0CMv9wl5acyqKt2gEdKVQMUeTiF/9N\ng129ubbDgRe/jQyv9+nJ7yzg7cnf+3W+zsGbC4fRvd6tmEVWofrL5WensiVxBjk5XicRf1AxRIlP\nZvzA0uxv+bzffV5HCZiK5eK5rPKD/HuMf4+0+mjiSraV/45Hr/yXX+cbSRrVqE1M7G4mzVzrdRTx\nAxVDFHDOcdPH93BxmYeoXT3R6zgB9Wqfa9mSv5r/pk/22zzv/XQ451foTtlSSX6bZ6QxM07IT+XT\nGdqcFAlUDFHgmbFfsCV7M2/dGVk7nItTtnQsV1cfRP/0B8jP9/3A+pk//ckvZV/n+av7+iFdZGtc\nuTnfrZrmdQzxAxVDhMvJy+XBKQO4KXkIZcuE/zkLR+LlPt3YxWb+8166z/O66Y1hNEq4iPon1vZD\nssj2z6bnsTznW69jiB+oGCJcv3ffhKzjeeamDl5HCZqE+BLc0+whhsx4gOzsY19rmLNgB3PjnufV\n7gP9mC5yXXFOc3aX/5FfMnd6HUV8pGKIYHtyc3j550e4t/ljxMZG19E0/+nahfjEPLo/NeKY53HN\n8KdoVLoNzWrX9WOyyFU6PpHyuxvy9kTtZwh3KoYI1v/9d4jdnszAq8/2OkrQxVgMb132Mh9uu4up\nczcd9es/mbiWRWVfYETPxwKQLnI1Kn8u6Yu0OSncqRgiVE5eLsMXPEa/Zg8SE6X/ypc0S6VV5X9x\n8fDbyc098tdlZzu6j7yVS2vcwmkn1gpcwAjUseF5LNyhj/oMd1H6KyPy3T9qBDFZ1Xng2pZeR/HU\nZ7c9xO4Kc+lw/+tH/JorHvoAq7SEd268P4DJItPVLc9hR/lpbNp8FE0sIUfFEIFy8/J4Yd4j3N74\nAUpEx4FIB1U6PomJN37C1zaAe4cf/lDKF0cuYUz+rXx0zf9IiI0PQsLIcmL5SiTmVue9r+d7HUV8\noGKIQIM/+gC3sxIPXdfK6yghoUVyPYa3eYchKy9h0MtzDzrd+1+u4fbpnRiQ+hhtG6QGMWFkqZd4\nHqPnaT9DOFMxRJh8l8+zsx/hlgYPRN2RSIfSq1V7hrZ9mUdWtqP1ne+xadNfh7FmZ0Ofx2ZwzeTz\n6HXGjTza5QYPk4a/jvVbMXvL117HEB/oM58jzEMffcRjU55g29PTiYtTMRxoyrI5XPrW9fy5uSQ1\ndl1MfEwpVuR+h9X4gWdaD6PP+Zd7HTHsrdmykRpPJrPhrk0cXynW6zhRwd+f+axiiCD5Lp9y/Ztw\nXc1HeKFvJ6/jhKx8l8+Hc9P5eNYUsnN3c/5pjel1zmUkxelaSP5S9p4m9E8Zxn3XnuN1lKigYpCD\nGvLZ5zwwaTDbn5wTcZ+3IOHl/MfuYfvmJGY9FdhP1ZO9/F0M2scQIZxzPDb1Ya4/+UGVgniua+oF\nLNj1ldcx5Bj5pRjMrL2ZLTazpWbWv5iv1zWz780s28zu8seYUtRzY8axa89unu3d2esoIlzT8jz2\nVJjH/MXbvI4ix8DnYjCzGGAY0A5oAHQzswM/IuwP4FbgSV/Hk79zzvHQlIe4utb9lErQSqB4LzGu\nFFVymvPy+Ayvo8gx8MdvkVRgmXNulXMuBxgJFPmz1Tm3yTk3G9DpkAHw0viJ7MjZxgs3XeZ1FJH9\nWtfqyNjlX3odQ46BP4qhGpBZ6PGaguckCJxzPDDpP1xV/X6SEqP8NGcJKXdc2InMUl+wfUe+11Hk\nKJX0OkBxBg8evP9+WloaaWlpnmUJda9OzGBb7kZeuuVKr6OIFHFm7VMoFVOel0fP5u6rmnkdJ6Jk\nZGSQkZERsPn7fLiqmbUABjvn2hc8HgA459yQYqYdBGx3zj1ziPnpcNWjULnf+bSt0oP37r7W6ygi\nf9P68f78sSGOec8+7HWUiBaKh6vOBJLNrJaZxQFdgdGHmF7HUvrJG19/w5b8TF6+5Sqvo4gUq3da\nJxbkjiYvz+skcjR8LgbnXB7QF5gALARGOucWmVlvM+sFYGZVzCwTuBO4z8xWm1lpX8eOdgPHPcyl\nVe6lTFJIbhEU4dLUs6DMOj6Z/KvXUeQo6MznMPV2xlSu/+Jq/hi8lHJldD0aCV1n/qc38TtrM3XI\nAK+jRKxQ3JQkQeac484vB3JFlUEqBQl5t7fqxoydI47qU/TEWyqGMPT05+PZnreJ1269xusoIod1\n1TnnYaU38dbYn72OIkdIxRBm8vLzGfTtQG469VESS+m8BQl9JWJKcHbZrrwweYTXUeQIqRjCTP93\nRuFy43nmxku8jiJyxAZ0uIqf7D12ZOlkt3CgYggjWdm7eWHBA9zX/DFKltRRvxI+2jVqSlLJsvzn\nHX2yWzhQMYSRf70wlDK763Fvt9ZeRxE5KmbGv+r25o35//U6ihwBFUOYWLBqPaP/eIK3uj2LaWVB\nwtCjXf9kZyT6AAAKdklEQVTFlgpfM2nGb15HkcNQMYSJS18aSFN60vGsU7yOInJMKiaVpXH8pQz4\n4DWvo8hhqBjCwOsTvmd5/ld8etf9XkcR8ckzl9/BrJhhrFq3y+socggqhhC3bWc2fdJv4JaTn6PG\n8WW8jiPik7T6KdQskUrv4W96HUUOQcUQ4jo+8TAV8uoxtJc+hEciw5OdB/BV1lNs/lOnQocqFUMI\nG/XNXKbuepUxfV4kJkZ7nCUyXN7ibCrH1qTH0Le8jiIHoWIIURu27ODaz7vRq9azND3lBK/jiPjV\ny5cN4Ysdg1iRmeV1FCmGrq4aopL7dccowbKn3vA6ikhA1L3/SsruasjMp3VQha90ddUocN3zr5OZ\nP5Op973gdRSRgBl5w/8xO/Y5PpuywusocgAVQ4h5+pPJvL32Xj7t+gnHV0jyOo5IwDQ5qQ5da/Tn\n6g9uYFe2rqEUSlQMIWTM9MXcPb0rTzYfQYfUel7HEQm4t2+6i9ikLDo/8pLXUaQQFUOISJ+1jM4f\nteGGWk/w7y6tvI4jEhQlS5RgbM93+Tr3IZ4YMc3rOFJAxRACxk5fQsdRrbi25mBeuaW713FEguqs\nuqfwxDlvMHDO5UyatcbrOIKKwXPPfvINF33SkutrP8wbt/b0Oo6IJ/7d6SK61rqLtu+3YuqP672O\nE/V0uKpHcvPyufSJF/jiz0d5ovl79OvSxutIIp7757OP8uXqdxh95VgubFHH6zhhw9+Hq6oYPPDt\nj6u45LWbyCm5hc+7v8v5pyd7HUkkZPQY/iJv//oIgxq+x4PXaH/bkVAxhLGV67fSbdjTTM97kbZl\n7+Szfv1JiIv1OpZIyBk2diJ3TOnOKTldGHf3I5x0QjmvI4W0kDzBzczam9liM1tqZv0PMs3zZrbM\nzOaZWWN/jBsuxs9YTpP+/agztA6bclYyo+c8xt97v0pB5CD6driAFf1+IiZ+J3WeO4V2Dz3Jr+v/\n9DpW1PB5jcHMYoClQGtgHTAT6OqcW1xomguBvs65jmbWHBjqnGtxkPmF/RpD1q5c3ps0hw9nTWbq\n5o/YnZDJGXFXMezq20mtW8vreCJhZdyshdwy6hFWlhxH7T2dubJRF267qDUnHFfa62ghI+Q2JZlZ\nC2CQc+7CgscDAOecG1JompeByc65UQWPFwFpzrkNxcwvLIohe3cei1Zv5OfM9Sxbv54f1/zCok0/\nsy5nIdsS55Owuxb1Ev7BNakX07fj+cSVLOl1ZJGwtjjzd+4d+T5T1n3J5sTpJO2sR624Mzi9aiMa\nVKtNk9q1SK1bk+PKJGFR9vm3/i4Gf/y2qgZkFnq8Bkg9zDRrC577WzEA1L/nJhwO2FsQzjn2/Wcv\nd8jnCh4V/O/e5/dPc+Br9n/9768DyHV7yGEnOZZFnu0kr0QW+SWycHHbiNldkbicqpR2J1A14SQa\nVm1Ar5Mvp3OLRtSpWulIl5+IHIF6NY7nk7vvAO7g9y1ZfPTdPCYums3stfNIX/k5239YSU5iJsTk\nErOnPCVzyxObX46SlKIkcZQouJW0OGJj4oihBGB/lYizgs9TN4y9z+37/30ftG6FvsaB00SQkPwz\nNmZe5v5/rKqn1KVKcl1iCv4BzQr9k5kRY3/9wxqFHttf/4hFpin0mn2v2v+4YJrCj+NjS1IhMYkK\npZOoWDqJCmUSqVQ2iZrHlyc+NiQXn0jEO75CErd0OodbOp1T5HnnYPPW3WRu/JM1f/zJ2j/+JCt7\nN9k5e9iVs4fsPXvYnbuH7Jw95Obn7v+jMX/fH4uF/rjMd3/9YQp//Vm5979//XHphd+XL+X3X5YF\nbP7++M22FqhZ6HH1gucOnKbGYabZb8GEMX6IJSLRxgyOKx/PceWr0PiUKl7HCRp/bzrzx1FJM4Fk\nM6tlZnFAV2D0AdOMBq6F/fsk/ixu/4KIiHjP5zUG51yemfUFJrC3aF53zi0ys957v+xecc6NNbMO\nZrYcyAJ6+DquiIgEhk5wExEJcyF5gpuIiEQOFYOIiBShYhARkSJUDCIiUoSKQUREilAxiIhIESoG\nEREpQsUgIiJFqBhERKQIFYOIiBShYhARkSJUDCIiUoSKQUREilAxiIhIESoGEREpQsUgIiJFqBhE\nRKQIFYOIiBShYhARkSJUDCIiUoSKQUREilAxiIhIET4Vg5lVMLMJZrbEzNLNrNxBpnvdzDaY2Y++\njCciIoHn6xrDAGCic64uMAkYeJDp/ge083EsOUoZGRleR4goWp7+peUZunwths7AWwX33wIuKW4i\n59x3wBYfx5KjpB88/9Ly9C8tz9DlazEc75zbAOCc+w043vdIIiLipZKHm8DMvgKqFH4KcMD9xUzu\n/JRLREQ8Ys4d++9yM1sEpDnnNphZVWCyc+60g0xbC/jCOdfoMPNUuYiIHCXnnPlrXoddYziM0cB1\nwBCgO/D5Iaa1gtsh+fObExGRo+frPoYhQBszWwK0Bh4HMLMTzOzLfROZ2fvA98CpZrbazHr4OK6I\niASIT5uSREQk8oTMmc9m1t7MFpvZUjPr73WecGFmK81svpnNNbMZBc8d9MRDMxtoZsvMbJGZtfUu\nufeKO/HyWJadmTU1sx8L3rvPBfv7CBUHWZ6DzGyNmc0puLUv9DUtz4Mws+pmNsnMFprZT2Z2W8Hz\nwXl/Ouc8v7G3oJYDtYBYYB5Qz+tc4XADVgAVDnhuCHBPwf3+wOMF9+sDc9m7b+mkgmVuXn8PHi67\nc4HGwI++LDtgOtCs4P5YoJ3X31sILc9BwF3FTHualuchl2VVoHHB/dLAEqBesN6fobLGkAosc86t\ncs7lACPZe/KcHJ7x9zW/g514eDEw0jmX65xbCSxj77KPSq74Ey+PatkVHI1Xxjk3s2C6tznIiZ6R\n7iDLE4o/6KQzWp4H5Zz7zTk3r+D+DmARUJ0gvT9DpRiqAZmFHq8peE4OzwFfmdlMM7uh4LkqrvgT\nDw9czmvRcj7QwU7aPNiyq8be9+s+eu/+XV8zm2dmrxXa9KHleYTM7CT2ron9wNH/bB/T8gyVYpBj\nd45zrinQAehjZufx9xMNdYTBsdOy881LQB3nXGPgN+Bpj/OEFTMrDXwE3F6w5hCUn+1QKYa1QM1C\nj6sXPCeH4ZxbX/D/G4HP2LtpaIOZVQEoWJX8vWDytUCNQi/Xcv67o112WqaH4Jzb6Ao2bgOv8tem\nSy3PwzCzkuwthXecc/vOEQvK+zNUimEmkGxmtcwsDujK3pPn5BDMLLHgLwrMLAloC/zEXyceQtET\nD0cDXc0szsxqA8nAjKCGDj0Hnnh5VMuuYHV+q5mlmpkB13LoEz0jXZHlWfDLa58uwIKC+1qeh/cG\n8LNzbmih54Lz/vR673uhvfDt2bvnfRkwwOs84XADarP3CK657C2EAQXPVwQmFizPCUD5Qq8ZyN4j\nFhYBbb3+Hjxefu8D64DdwGqgB1DhaJcdcEbB8l8GDPX6+wqx5fk28GPB+/Qz9m4j1/I8/LI8B8gr\n9PM9p+B35FH/bB/L8tQJbiIiUkSobEoSEZEQoWIQEZEiVAwiIlKEikFERIpQMYiISBEqBhERKULF\nICIiRagYRESkiP8H5j87XpiRji0AAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x107f049d0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(cvx.conv(c, x).value)\n",
    "plt.plot(np.convolve(c, x0))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CPU times: user 3 ms, sys: 2.27 ms, total: 5.28 ms\n",
      "Wall time: 4.59 ms\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "array([ -1.13686838e-16,  -1.02318154e-16,  -1.47792889e-16, ...,\n",
       "        -2.95585778e-16,  -2.50111043e-16,  -3.18323146e-16])"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from scipy.signal import fftconvolve\n",
    "%time fftconvolve(c, x0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "x = cvx.Variable(n)\n",
    "f = cvx.conv(c, x)\n",
    "prob = cvx.Problem(cvx.Minimize(0), [f == 0])\n",
    "A = prob.get_problem_data(cvx.SCS)[\"A\"]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "ename": "ValueError",
     "evalue": "dimension mismatch",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mValueError\u001b[0m                                Traceback (most recent call last)",
      "\u001b[0;32m<ipython-input-18-b15b02e0569a>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mget_ipython\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmagic\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34mu'time A*x0'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
      "\u001b[0;32m/usr/local/lib/python2.7/site-packages/IPython/core/interactiveshell.pyc\u001b[0m in \u001b[0;36mmagic\u001b[0;34m(self, arg_s)\u001b[0m\n\u001b[1;32m   2161\u001b[0m         \u001b[0mmagic_name\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0m_\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmagic_arg_s\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0marg_s\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpartition\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   2162\u001b[0m         \u001b[0mmagic_name\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmagic_name\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlstrip\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mprefilter\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mESC_MAGIC\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2163\u001b[0;31m         \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrun_line_magic\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmagic_name\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmagic_arg_s\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   2164\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   2165\u001b[0m     \u001b[0;31m#-------------------------------------------------------------------------\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/usr/local/lib/python2.7/site-packages/IPython/core/interactiveshell.pyc\u001b[0m in \u001b[0;36mrun_line_magic\u001b[0;34m(self, magic_name, line)\u001b[0m\n\u001b[1;32m   2082\u001b[0m                 \u001b[0mkwargs\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'local_ns'\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0msys\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_getframe\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstack_depth\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mf_locals\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   2083\u001b[0m             \u001b[0;32mwith\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbuiltin_trap\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2084\u001b[0;31m                 \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfn\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   2085\u001b[0m             \u001b[0;32mreturn\u001b[0m \u001b[0mresult\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   2086\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m<decorator-gen-60>\u001b[0m in \u001b[0;36mtime\u001b[0;34m(self, line, cell, local_ns)\u001b[0m\n",
      "\u001b[0;32m/usr/local/lib/python2.7/site-packages/IPython/core/magic.pyc\u001b[0m in \u001b[0;36m<lambda>\u001b[0;34m(f, *a, **k)\u001b[0m\n\u001b[1;32m    191\u001b[0m     \u001b[0;31m# but it's overkill for just that one bit of state.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    192\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0mmagic_deco\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0marg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 193\u001b[0;31m         \u001b[0mcall\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mlambda\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mk\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mk\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    194\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    195\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0mcallable\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0marg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/usr/local/lib/python2.7/site-packages/IPython/core/magics/execution.pyc\u001b[0m in \u001b[0;36mtime\u001b[0;34m(self, line, cell, local_ns)\u001b[0m\n\u001b[1;32m   1171\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0mmode\u001b[0m\u001b[0;34m==\u001b[0m\u001b[0;34m'eval'\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1172\u001b[0m             \u001b[0mst\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mclock2\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1173\u001b[0;31m             \u001b[0mout\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0meval\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcode\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mglob\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlocal_ns\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   1174\u001b[0m             \u001b[0mend\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mclock2\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1175\u001b[0m         \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m<timed eval>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n",
      "\u001b[0;32m/usr/local/lib/python2.7/site-packages/scipy/sparse/base.pyc\u001b[0m in \u001b[0;36m__mul__\u001b[0;34m(self, other)\u001b[0m\n\u001b[1;32m    369\u001b[0m             \u001b[0;31m# dense row or column vector\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    370\u001b[0m             \u001b[0;32mif\u001b[0m \u001b[0mother\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mshape\u001b[0m \u001b[0;34m!=\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mN\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0mother\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mshape\u001b[0m \u001b[0;34m!=\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mN\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[0m\n\u001b[0;32m--> 371\u001b[0;31m                 \u001b[0;32mraise\u001b[0m \u001b[0mValueError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'dimension mismatch'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    372\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    373\u001b[0m             \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_mul_vector\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mravel\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mother\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: dimension mismatch"
     ]
    }
   ],
   "source": [
    "%time A*x0"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.11"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}
