{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# DiscreteDP Example: Automobile Replacement" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Daisuke Oyama**\n", "\n", "*Faculty of Economics, University of Tokyo*" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We study the finite-state version of the automobile replacement problem as considered in\n", "Rust (1996, Section 4.2.2)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "* J. Rust, \"Numerical Dynamic Programming in Economics\",\n", " Handbook of Computational Economics, Volume 1, 619-729, 1996." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "%matplotlib inline" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import itertools\n", "import scipy.optimize\n", "import matplotlib.pyplot as plt\n", "import pandas as pd\n", "from quantecon.markov import DiscreteDP" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "# matplotlib settings\n", "plt.rcParams['axes.autolimit_mode'] = 'round_numbers'\n", "plt.rcParams['axes.xmargin'] = 0\n", "plt.rcParams['axes.ymargin'] = 0\n", "plt.rcParams['patch.force_edgecolor'] = True\n", "\n", "from cycler import cycler\n", "plt.rcParams['axes.prop_cycle'] = cycler(color='bgrcmyk')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Setup" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "lambd = 0.5 # Exponential distribution parameter\n", "c = 200 # (Constant) marginal cost of maintainance\n", "net_price = 10**5 # Replacement cost" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "n = 100 # Number of states; s = 0, ..., n-1: level of utilization of the asset\n", "m = 2 # Number of actions; 0: keep, 1: replace" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "# Reward array\n", "R = np.empty((n, m))\n", "R[:, 0] = -c * np.arange(n) # Costs for maintainance\n", "R[:, 1] = -net_price - c * 0 # Costs for replacement" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "# Transition probability array\n", "# For each state s, s' distributes over\n", "# s, s+1, ..., min{s+supp_size-1, n-1} if a = 0\n", "# 0, 1, ..., supp_size-1 if a = 1\n", "# according to the (discretized and truncated) exponential distribution\n", "# with parameter lambd\n", "supp_size = 12\n", "probs = np.empty(supp_size)\n", "probs[0] = 1 - np.exp(-lambd * 0.5)\n", "for j in range(1, supp_size-1):\n", " probs[j] = np.exp(-lambd * (j - 0.5)) - np.exp(-lambd * (j + 0.5))\n", "probs[supp_size-1] = 1 - np.sum(probs[:-1])\n", "\n", "Q = np.zeros((n, m, n))\n", "\n", "# a = 0\n", "for i in range(n-supp_size):\n", " Q[i, 0, i:i+supp_size] = probs\n", "for k in range(supp_size):\n", " Q[n-supp_size+k, 0, n-supp_size+k:] = probs[:supp_size-k]/probs[:supp_size-k].sum()\n", "\n", "# a = 1\n", "for i in range(n):\n", " Q[i, 1, :supp_size] = probs" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "# Discount factor\n", "beta = 0.95" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Continuous-state benchmark" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let us compute the value function of the continuous-state version\n", "as described in equations (2.22) and (2.23) in Section 2.3." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "def f(x, s):\n", " return (c/(1-beta)) * \\\n", " ((x-s) - (beta/(lambd*(1-beta))) * (1 - np.exp(-lambd*(1-beta)*(x-s))))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The optimal stopping boundary $\\gamma$ for the contiuous-state version, given by (2.23):" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "52.86545636058919\n" ] } ], "source": [ "gamma = scipy.optimize.brentq(lambda x: f(x, 0) - net_price, 0, 100)\n", "print(gamma)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The value function for the continuous-state version, given by (2.24):" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "def value_func_cont_time(s):\n", " return -c*gamma/(1-beta) + (s < gamma) * f(gamma, s)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "v_cont = value_func_cont_time(np.arange(n))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Solving the problem with `DiscreteDP`" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Construct a `DiscreteDP` instance for the disrete-state version:" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "ddp = DiscreteDP(R, Q, beta)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let us solve the decision problem by\n", "\n", "(0) value iteration, \n", "(1) value iteration with span-based termination\n", "(equivalent to modified policy iteration with step $k = 0$), \n", "(2) policy iteration, \n", "(3) modified policy iteration." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Following Rust (1996), we set:\n", "\n", "* $\\varepsilon = 1164$ (for value iteration and modified policy iteration),\n", "* $v^0 \\equiv 0$,\n", "* the number of iteration for iterative policy evaluation $k = 20$." ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "v_init = np.zeros(ddp.num_states)\n", "epsilon = 1164\n", "methods = ['vi', 'mpi', 'pi', 'mpi']\n", "labels = ['Value iteration', 'Value iteration with span-based termination',\n", " 'Policy iteration', 'Modified policy iteration']\n", "results = {}\n", "\n", "for i in range(4):\n", " k = 20 if labels[i] == 'Modified policy iteration' else 0\n", " results[labels[i]] = \\\n", " ddp.solve(method=methods[i], v_init=v_init, epsilon=epsilon, k=k)" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [], "source": [ "columns = [\n", " 'Iterations', 'Time (second)', r'$\\lVert v - v_{\\mathrm{pi}} \\rVert$',\n", " r'$\\overline{b} - \\underline{b}$', r'$\\lVert v - T(v)\\rVert$'\n", "]\n", "df = pd.DataFrame(index=labels, columns=columns)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The numbers of iterations:" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "114 \t(Value iteration)\n", "65 \t(Value iteration with span-based termination)\n", "5 \t(Policy iteration)\n", "6 \t(Modified policy iteration)\n" ] } ], "source": [ "for label in labels:\n", " print(results[label].num_iter, '\\t' + '(' + label + ')')\n", " df[columns[0]].loc[label] = results[label].num_iter" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Policy iteration gives the optimal policy:" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1\n", " 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1]\n" ] } ], "source": [ "print(results['Policy iteration'].sigma)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Takes action 1 (\"replace\") if and only if $s \\geq \\bar{\\gamma}$, where $\\bar{\\gamma}$ is equal to:" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "53" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(1-results['Policy iteration'].sigma).sum()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Check that the other methods gave the correct answer:" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "True\n", "True\n", "True\n" ] } ], "source": [ "for result in results.values():\n", " if result != results['Policy iteration']:\n", " print(np.array_equal(result.sigma, results['Policy iteration'].sigma))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The deviations of the returned value function from the continuous-state benchmark:" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1733.77910196 \t(Value iteration)\n", "1085.80571693 \t(Value iteration with span-based termination)\n", "1162.88060863 \t(Policy iteration)\n", "1144.47728382 \t(Modified policy iteration)\n" ] } ], "source": [ "diffs_cont = {}\n", "for label in labels:\n", " diffs_cont[label] = np.abs(results[label].v - v_cont).max()\n", " print(diffs_cont[label], '\\t' + '(' + label + ')')" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAf4AAAFNCAYAAADhMQ3+AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xd4FGXbxuHfTUjovUnoYqETICCKKKD0roDSexFRfG3Y\nBQX7axcRG6KIKHYRRAREfG0EQkdEAWnSUSHU5Pn+mIVvxVRIdlKu8zj2yO7O7Mw1s5u993mmmXMO\nERERyRly+R1AREREQkeFX0REJAdR4RcREclBVPhFRERyEBV+ERGRHESFX0REJAdR4ZeQMbPeZjbX\n7xwnmVk+M/vUzP40s/dSMX4zM9sa9Hi1mTXL0JByipkdNLNz/c6R0cxsipmNz6BpjzezPWb2R0ZM\nP5n5TjKze0M5T0maCn8WZGa9zGxJ4Itwh5nNNrNL/c6VEufcNOdcK79zBOkGlAFKOOe6p/XFzrma\nzrmF6Z4qCaf/8MjOzGyhmQ0Jfs45V9A595tfmbI6M6sI3ALUcM6dk4HzGWBmi4Ofc86NcM49mFHz\nlLRR4c9izOxm4GngIbyiVRF4AejkZ66UmFluvzMkohKw3jl3wu8gAGYW5ncGydYqAnudc7v8DiI+\nc87plkVuQBHgINA9mXHy4P0w2B64PQ3kCQxrBmwFbgd2ATuALkA7YD2wD7graFpjgZnADOBvYClQ\nN2j4HcCvgWFrgK5BwwYA3wJPAXuB8YHnFgeGW2DYLuAvYCVQK2g5pwK7gc3APUCuoOkuBp4A9gMb\ngbbJrI/qwELgALAa6BR4fhxwDDgeWKeDE3ltPmBKYD5rgNuArUHDNwFXBu43ApYElmUn8GTQeJcC\n/wtk2AIMCDw/BXgR+Bw4BFwZeP+eAH4PTGdSIEcB4DCQEMh7EIjE+/F+8n3YC7wLFE9iXawFOgQ9\nzh1Yx/WBvMBbgWkcAH4CyqTyc5nU8p3R+whMAOKBI4HlfD7wvAPOC1p3LwCz8D5/PwBVA8MqB8bN\nHZRxITAkcD9XIMtmvM/fVKBI8P/IacuXqvc5tes68Pg94A/gT2ARUDNo3CnA+OD1dNq0g9dDop+X\nRPJcedrnZ0oqlnUs3udpamAdrwaig8atAHwQWK69wPN4/29HAu/fQeDA6csUeDwU2ID3nfMJEHna\n8o0AfsH7TL0AWGDYecDXgfW2B5jh9/dyVrz5HkC3NLxZ0AY4EfyFlsg4DwDfA6WBUnhfyA8GhjUL\nvP4+IDzwz7cbeBsoBNQMfDlUCYw/Fq8wdguMfyveF3R4YHh3/r/4XINXvMoGhg0IzOuGwJdePv5Z\n+FsDMUBRvB8B1YNeOxX4OJCpMt6PksFB0z0eyB4GXIf3A8cSWRfhgS+Xu4AIoEXgC+zCoOV7K5l1\n+QjwDVA88CW3iqQL/3dA38D9gkDjwP1KgXn2DOQpAUQFhk0JfIE1CazDvHg/hj4JzLMQ8CnwcND7\nd/oX9ejA+10erwi8BExPYnnuA6YFPW4PrA3cHx6YV/7Aem0AFE7FZzK55Tvj95GgQh00r9ML/168\nQpwbmAa8ExhWmeQL/6DA5+LcwHv1AfBmMus4xfc5Les6KEMh/v+HemzQsCmkvvAn+XlJJNM/li0V\nyzoWr4i3C7xHDwPfB4aFAcsD8y+A99m9NJnMwcvUAq9o1w8s/3PAotOW7zO874aKeN9RbQLDpgN3\n8///L5eG4rs3u918D3DWCwCv4f1qX5WKcQcEPkSxgduQjM6XzsvaG/gjhXF+BdoFPW4NbArcb4ZX\n2MMCjwsF/skuCho/BugSuD/25D964HEuvF6CpknMOxboHLSuf09k/Z8s/C3wCkFjAq3AwPNheC3x\nGkHPDQcWBk1jQ9Cw/IFlOCeRPE3xWlXB058OjA1avuQK/28nv3ACj4eRdOFfhNeLUPK0adwJfJjE\n9KcAU4MeG96Pp6pBz10MbAx6/07/ol4LXBH0uCxeQf3Xj0O81tLfQP7A42nAfYH7g/B+JNZJ42cy\n0eU72/eR1BX+V4KGtQPWBe5XJvnC/xUwMmjYhSfXWRLrOMX3OS3rOpFxiwbyFglathQLf0qfl0Tm\n849lS8WyjgXmBQ2rARwOms/uJD5niWUOXqZXgceChhUMrP/KQct3adDwd4E7AvenApOB8mn5nOr2\nz1t22MY/Ba8lnFoznHNRgdsrGZQpo+wFSqawvTwSrwvzpM2B505NwzkXH7h/OPB3Z9Dww3j/iCdt\nOXnHOZeAt6kgEsDM+plZrJkdMLMDQC2gZGKvPZ1zbj5e1+ALwC4zm2xmhQOvD09kGcoFPf4jaDpx\ngbvBmU+KBLYEcic1reREnrYMm5MaERgMXACsM7OfzKxD4PkKeD/GkhI8/VJ4BTAmaJ3OCTyflErA\nh0Hjr8XrZi1z+ojOuQ2B4R3NLD/efiFvBwa/CXwBvGNm283sMTMLT2a+JyW1fOn5PiYleM/0uDS8\nNrH/kdwkss4SkdT7/A/JrWszCzOzR8zsVzP7C6/Ywj//d1LjTD4vaXX6Os4b+P6pAGx2Z7Z/zD/W\nv3PuIN53W6KfDf753t6O94Pnx8BRNYPOYP45XpYv/M65RXjbiU4xs6pmNsfMYszsGzOr5lO89PYd\ncBRvu3xStuMVg5MqBp47UxVO3jGzXHhdytvNrBLwMjAKb6/4onhd4Rb0WpfchJ1zzzrnGuC1JC7A\n24a+B+/X/+nLsO0Msm8HKgRyn8m0dhC0/IHXJso594tzrifeJpZHgZlmVgCvsFdNZh7B62gP3g+v\nms65ooFbEedcwUTGPWkL3rbxokG3vM65pJZxOl63fGdgTaBA4Zw77pwb55yrAVwCdAD6JZM7eP6J\nLd/Zvo/JfnZScCjwN3/Qc8F7sSf2P3IC7wfwoeDXBXa4PFVIk3mfE5PougZ6BZ67Em8/iMonZ5fE\nsgTnCV6OlD4vKUl2WVOwBaiYRCMkpffuH+s/sP5KkIrPhnPuD+fcUOdcJF4P0kQzOy+VmSUgyxf+\nJEwGbggUlVuBiUHDrjazlWY208wqJP7yzMk59yfetsMXzKyLmeU3s3Aza2tmjwVGmw7cY2alzKxk\nYPy3zmK2DczsqsA/+E14Pzy+x9uu5/C6+zCzgXgt/lQxs4ZmdlGgVXkIb1tiQqA34l1ggpkVCvzA\nuPkMl+EHvNbC7YH11AzoCLyTyte/C9xpZsXMrDze/gpJLU8fMysV6F04EHg6Aa+L90oz62Fmuc2s\nhJlFJTaNwGtfBp4ys9KB6ZYzs9aBUXYCJcysSNDLJuGtq0qB8UuZWedklukdoBXeNvWTrX3MrLmZ\n1Q58+f+FV7QTEp/EPyS6fOnwPu7E2wafZs653XhFpE+gdT2If/44mQ78x8yqmFlBvCNkZgRar+vx\nWrXtA5/Ne/C2QwPJvs+JSXRd421iO4rXys0fmH9SlgM1zSzKzPLidb+fXM6UPi8pSXZZU/Aj3g/j\nR8ysgJnlNbMmgWE7gfJmFpHEa6cDAwPLlAdv+X9wzm1KaaZm1j3wvwjeTqGO1H1OJUi2K/yBf+RL\ngPfMLBZvZ6eygcGf4m1Hqg18CbzhT8oz55z7L94X6D14RXcLXqv7o8Ao4/H2Ol6Bt6f80sBzZ+pj\nvB339gN9gasCrcM1wH/xeiF2ArXx9uJPrcJ4X1r78br99gKPB4bdgPdj4De8Pb/fxtuXI02cc8fw\nCn1bvNbRRKCfc25dKicxLpBtIzAXrzs8KW2A1WZ2EHgGuNY5d9g59zve9udb8HqmYoG6yUxnDN6O\nZ98HuoHn4W2DJpB7OvBboGs3MjCvT4C5ZvY33o+yi5KauHNuB957dgne0RonnYN3BMdfeF3UX59c\nXvNOvjIpieklt3xn8z4+A3Qzs/1m9mwqXxNsKF4P0l68nVb/FzTsNbxlW4T33h4JZD3543ok8Are\nj4dDeJu3Tkr0fU4sQDLreire52ob3tEi3ye1EM659Xg77M7D28t98WmjJPl5SUkqljW518bj/W+d\nh3dEwVa87wmA+XhHAPxhZnsSee084F7gfbwfD1WBa1MzX6Ah8ENg/X8CjHY6t0OandyDNkszs8rA\nZ865WoHtxD8758qm8JowYJ9zrkhy4+VkZjYWb2eqPn5nERGR9JHtWvzOub+AjWbWHcA8dQP3g38M\ndMJr2YiIiOQYISn8ZlbBzBaY2ZrAnpijExmnt5mtCGx//9/JYp2KaU/H60670My2mtlgvMPeBpvZ\ncrwup5PbPG8MzH85cCPeYSciIiI5Rki6+gMt7bLOuaVmVoj/P1Z8TdA4l+Cd4GK/mbXFO9Y6yW2V\nIiIiknYhOX96YCeXHYH7f5vZWrxjNtcEjRO8883JM5GJiIhIOgr5Nv7Ajnj18A61SspgYHYo8oiI\niOQkIb1iWuBQu/eBmwI74SU2TnO8wp/oZWbNbBjeqVMpUKBAg2rVssu5eURERFIWExOzxzl3xmdo\nDNnhfIETRHwGfOGcezKJceoAH+KdiWx9StOMjo52S5YsSd+gIiIimZiZxTjnos/09aHaq9/wLsyw\nNpmiXxHvKll9U1P0RUREJO1C1dXfBO+sbysDZ9MD71KpFQGcc5PwTi1bAu/cywAnzuYXjYiIiPxb\nqPbqX0ziF6AIHmcIMCQUeURERHKqbHfmPhEREUmaCr+IiEgOosIvIiKSg6jwi4iI5CAq/CIiIjmI\nCr+IiEgOosIvIiKSg6jwi4iI5CAq/CIiIjmICr+IiEgOosIvIiKSg6jwi4iI5CAq/CIiIjlIqC7L\nKyI5jHOwfz9s2+bdtm+Ho0f9TiWStRQoAP36pe80VfhF5Kw4B7/9BitWwJo1sHq1d/vlFzh82O90\nIllb+fIq/CLisz//hG+/hR9+gB9/9G779v3/8EqVoGZNuOIKqFABypXzbpGRkD+/f7lFsqJcGbBB\nXoVfRJIVFweLF8P8+d4tJgYSErwvpJo14aqroFEjiIqCKucfYcfRX/h578/8tv83dsTtYVXcXvZu\n2cu+9fs4nnDc78URyVJKFyjNx9d+nK7TVOEXkX/ZuhU++ww+/RS++srbNp87NzRuDPfcA82aQaUa\nO1n75xKWbF/CpztieOS71Wz8fCMOd2o6ecLyUCJ/CUrkK0HxfMUpnKewfwslkgUVjCiY7tNU4RcR\nwNtOP2MGzJwJS5d6z517LowYAa1bO8rU/Jkfdy3k681f81rsYrYu2gqAYVQrWY2GkQ3pW6cv1UpW\no1rJapxX/LwM+dISkbOjwi+Sg23f7hX7d97xttWD16p/5BG4tNUefss1h9kbPmfg6vns/HEnAJGF\nIrms0mU0imxEdGQ09crWU4EXyUJU+EVymGPHvG78V1+FOXO87fX168Njj0H9Vuv44a8P+Hj9Z9z5\nyfc4HKULlKbluS1pVrkZl1e6nPOKn4eZ+b0YInKGVPhFcogNG2DSJJg6FXbv9vayv+MOaNr1Z5bE\nvcebq9/l9o9WAtAwsiH3XX4f7c9vT4PIBuQynetLJLtQ4RfJxhISYO5ceO45mD0bwsKgUyfo1m8v\nO0u/zZsrp/DQLG+D/qUVL+XZNs9ydY2riSwU6XNyEckoKvwi2VBcHLz+OjzzjHcinTJl4J774rmg\n7Rd8tPk1+q/4hOMJx6lftj5PtX6KbjW6Ub5web9ji0gIqPCLZCN798LEifDss7Bnj3d8/aSpe9hb\n8VVejp3EpjmbKJW/FKMajWJA1ADqlKnjd2QRCTEVfpFsYMcOePxxmDwZDh2C9u2hy8ilLD72LKNX\nvcPR347SvHJzHm/5OJ0u7EREWITfkUXEJyr8IlnYH3/Ao496O+0dPw49ezma9JvLe9sfY+hP8ykY\nUZDB9QYzsuFIapau6XdcEckEVPhFsqBdu7yC/+KL3uF5vfueoE6vd5j66+O89e0KIgtF8njLxxla\nfyhF8hbxO66IZCIq/CJZyMGD8OSTXrd+XBz06nOC2r2n8fLP45n6vw3ULFWTKZ2n0LN2T3Xni0ii\nVPhFsoDjx+GVV2DcONi5E7pefYKGg9/i1V/G89Z3v1LvnHp8dM1HdLywo465F5FkqfCLZGLOwaxZ\ncPPN3mF5lzZ13DBpJm9suZsPf/yF+mXr8/G1H9Pxgo46m56IpIqaBiKZ1Nq10LYtdOzoXQL3wWnz\nOdr3Iu5Z3oOIsAg+uuYjlgxdQqcLO6noi0iqqcUvkskcOABjx8Lzz0PBgnD7E6uILX0r9/7yBRUK\nV2BK5yn0qdOHsFxhfkcVkSxIhV8kk3AOpk2DW27xzqXfd/gewq68nydWT6LI9iI80fIJrm90PXlz\n5/U7qohkYSr8IpnAunUwciQsWADRFx2n7wsTefXXsfy9+m9GRo9kbLOxlMhfwu+YIpINqPCL+OjI\nEZgwwTsmv0ABuPmZb/gi93X8d/VqWlVtxZOtntSJd0QkXYWk8JtZBWAqUAZwwGTn3DOnjWPAM0A7\nIA4Y4JxbGop8In749lsYPBh+/hm69d9Frta38+T6N6hUpJL21BeRDBOqvfpPALc452oAjYHrzazG\naeO0Bc4P3IYBL4Yom0hIHTwIN94ITZvC4SMJ3Dj1Jb6qXo0PN7zNnZfeyZrr12hPfRHJMCFp8Tvn\ndgA7Avf/NrO1QDlgTdBonYGpzjkHfG9mRc2sbOC1ItnCvHleK3/LFugz+md+rTmUZ3/7hmaVmzGx\n3USql6rud0QRyeZCfhy/mVUG6gE/nDaoHLAl6PHWwHMiWd6hQzBqFLRsCXnzH2fomw/xbom6rNm7\nktc6vcb8fvNV9EUkJEK6c5+ZFQTeB25yzv11htMYhrcpgIoVK6ZjOpGM8d130K8fbNgAvW5Zxsqq\nA5m8YTndanTjubbPcU7Bc/yOKCI5SMha/GYWjlf0pznnPkhklG1AhaDH5QPP/YNzbrJzLto5F12q\nVKmMCSuSDo4dg7vugksvhWMnjjNwyoO8W6QRu+N28kGPD3iv+3sq+iIScqHaq9+AV4G1zrknkxjt\nE2CUmb0DXAT8qe37klWtXw+9ekFMDHQdtoZN9frz+qYl9Krdi+faPkfxfMX9jigiOVSouvqbAH2B\nlWYWG3juLqAigHNuEvA53qF8G/AO5xsYomwi6cY5eP11b6/98IgE+k96mnd230XBvwryXvf36Faj\nm98RRSSHC9Ve/YuBZI9NCuzNf30o8ohkhP37YfhweO89uKT1dsKu7s8b2+fR6cJOTO4wmTIFy/gd\nUUREZ+4TSQ8//gjXXANbt0LfCR/xee4hHN59mMkdJjOk/hAdky8imYYuyytyFpyDp5/2duCLzxVH\nx5dG8ObxrlQqWomlw5YytMFQFX0RyVTU4hc5Q/v3w8CB8PHH0PyaNexo0oOPtqzh9ktu58EWDxIR\nFuF3RBGRf1HhFzkDS5fC1VfDtm3Q89EpfHziegocKcAXfb6gZdWWfscTEUmSuvpF0uj11+GSS+C4\nHaLlCwOYfnggjco1InZErIq+iGR6KvwiqXTkCAwbBoMGQb2W6yh4UyNmb5/KfZfdx7y+84gsFOl3\nRBGRFKmrXyQVfv/d69pfsgS63v0+XxYYQN6jeZnbdy5Xnnul3/FERFJNLX6RFHzzDURHw7r1J+j8\nwm18GN6NmqVqsnTYUhV9EclyVPhFkvHSS9CiBRQ6Zxc1HmnJx7ufYGT0SL4e8DUVilRIeQIiIpmM\nuvpFEnHsGIweDZMmwSVXL2XzxV1YsW83b3R5g351+/kdT0TkjKnwi5xmzx5ve/6iRdDxrul8mX8Q\npXKV4ttB31K/bH2/44mInBV19YsEWbsWLroIvv8xng7PjOHTiF40jGzIkmFLVPRFJFtQ4RcJmDsX\nLr4Y/j72F9FPdOKz/Y9xXfR1zOs3j9IFSvsdT0QkXairXwSYONG7lO75DTeScG1Hftz3M5PaT2J4\n9HC/o4mIpCsVfsnR4uPhllvgmWfgkmu/5ed6XYg/coIv+nxBiyot/I4nIpLuVPglx4qLgz594MMP\nodVtb7Kw8BAq5avEZ70+44ISF/gdT0QkQ2gbv+RIu3Z5x+d/+JGj9cP3M7dAP5pUaML3Q75X0ReR\nbE0tfslx1q+Htm1h2x/HuPypIXxx4E0GRA3gpQ4v6VK6IpLtqcUvOcoPP3hX1vvz6AFqPdKGrw+8\nyQPNHuC1Tq+p6ItIjqAWv+QYs2ZB9+5Q6vzNRAxsx4oDvzC1y1T61u3rdzQRkZBR4Zcc4fXXYehQ\nuOCy5exr25Y/j8Qxp88c7bkvIjmOuvolW3MOHnoIBg2CqC4L2dbyMnKH5WLxoMUq+iKSI6nFL9lW\nQgLcfLN3jH7T4TP5oXxvqhauyhd9vtCV9UQkx1Lhl2zpxAkYPBimToVmt7/A1/lv4JLIS/ik5ycU\nz1fc73giIr5R4Zds58gRuOYa+OQTR7OxY1nIA3S6sBPvXP0O+cLz+R1PRMRXKvySrfz1F3TuDAu/\nTuCyR0az8MjzDIoaxEsdXyJ3Ln3cRUT0TSjZxt690KYNLFtxnCZPDGTR39O49eJbeazlY5iZ3/FE\nRDIFFX7JFv74A1q2hPUbD1Pv0e58++csHr7iYcY0GaOiLyISRIVfsrwtW+DKK2HLrr+p9mAHYv78\nRpfUFRFJggq/ZGm//gpXXAH74vZT+b42rP47hmlXTaNn7Z5+RxMRyZRU+CXLWrfOK/qHc+2i7J2t\n+PXQWt7v8T6dq3X2O5qISKalwi9Z0urVXtE/kX8bRUddyZa4zXza81NaVW3ldzQRkUxNhV+ynBUr\nvG36FNlM/uEt2H10F3P6zOGySpf5HU1EJNNT4ZcsJTbWK/q5S20k9+Dm/HXiAPP6zuOi8hf5HU1E\nJEtQ4ZcsIybGO2QvT9kN2IAWxMUfZH7/+dQvW9/vaCIiWYYKv2QJS5d6Lf38FdaT0LcFx9wR5vef\nT9Q5UX5HExHJUlT4JdNbtixQ9Cuu40TvFjhOsKD/AmqXqe13NBGRLCdXKGZiZq+Z2S4zW5XE8CJm\n9qmZLTez1WY2MBS5JPM7uU0/b7mfOd67OZYrgYUDFqroi4icoZAUfmAK0CaZ4dcDa5xzdYFmwH/N\nLCIEuSQTW77cO2Qvoux64vt6RX9+//nUKFXD72giIllWSAq/c24RsC+5UYBC5p1UvWBg3BOhyCaZ\n06pVXtEPP+cXXL/mODvB/H4q+iIiZyuzbON/HvgE2A4UAq5xziX4G0n8cvKMfGGlNkD/5sTbMRb0\nX0DN0jX9jiYikuWFqqs/Ja2BWCASiAKeN7PCiY1oZsPMbImZLdm9e3coM0oInDz3fkLhjeQa2JwT\nHOGrfl9Rq3Qtv6OJiGQLmaXwDwQ+cJ4NwEagWmIjOucmO+einXPRpUqVCmlIyVibN0OLFhAXvoU8\nw1pw1B1iXr951ClTx+9oIiLZRmYp/L8DVwCYWRngQuA3XxNJSG3b5hX9Ayd2UHjUFfwdv4+5fefq\nOH0RkXQWkm38ZjYdb2/9kma2FbgfCAdwzk0CHgSmmNlKwIAxzrk9ocgm/tu92ztkb+fB3ZS+/Up2\nHd3O3L5ziY6M9juaiEi2E5LC75xL9uLozrntgC6rlgMdOACtWsGmnfsof3dLth3ZyOzes7mkwiV+\nRxMRyZYyS1e/5EAHD0K7drDql7+pdFdbfj+8lo+u/YjLK1/udzQRkWwrsxzOJznMkSPQpQt8H3OY\nGhM6sS4uhvd7vE+rqur4ERHJSCr8EnInTsC118JXC49R96HurDj0NW92fZPO1Tr7HU1EJNtT4ZeQ\nSkiAwYPh40/iqT+hH0sPz2JS+0n0rtPb72giIjmCtvFLyDgHt9wCU6c66t8/gqXHZvDYlY8xPHq4\n39FERHIMFX4JmQkT4OmnocGYO1jKK9zd9G5ua3Kb37FERHIUFX4JiRdfhHvvhXqjHiMm32NcF30d\nDzZ/0O9YIiI5jgq/ZLgZM+D666HugFdZVnIM19S8hufaPod3MUYREQmlNBd+MytgZmEZEUayn3nz\noG9fqNb1A1ZWGUbrqq2Z2nUqYbn0ERIR8UOKhd/McplZLzObZWa7gHXADjNbY2aPm9l5GR9TsqKl\nS6FrVyjfdD6/1utJo3KNeL/H+0SERfgdTUQkx0pNi38BUBW4EzjHOVfBOVcauBT4HnjUzPpkYEbJ\ngjZsgLZtoeB5y9h9RRfOL34+s3rNokBEAb+jiYjkaKk5jv9K59zx0590zu0D3gfeN7PwdE8mWdYf\nf0Dr1nCswG/kvrYtxSKKMqfPHIrnK+53NBGRHC/FFn9iRf8kMxuY0jiSs/z1l3f+/R1/7aLgda1J\nsON80ecLyhcu73c0ERHh7PfqH5cuKSRbOHYMunWD5WsPUn5Me/Ye28ZnPT+jeqnqfkcTEZGAFLv6\nzWxFUoOAMukbR7Iq52DoUPjyq+PUfOhq1sUt46NrP+LiChf7HU1ERIKkZht/GaA1sP+05w34X7on\nkizpnnu8U/HWHTuE5Ufm8mqnV+lwQQe/Y4mIyGlSU/g/Awo652JPH2BmC9M9kWQ5kybBQw9BvZvv\nYxlTGddsHIPqDfI7loiIJCLFwu+cG5zMsF7pG0eymk8/9c7KV2vASywrPJ4h9YZw72X3+h1LRESS\noMvyyhlbsgSuvRbObfMZa6qMpN157Xixw4s6Fa+ISCZ2Jqfs7ZgRQSRr2bQJOnSAItV/Ytsl11Dv\nnHrM6DaD3Ln0W1JEJDM7k8P5JqR7CslS9u/3jtWPy7ORY906UKZgaWb1mkXBiIJ+RxMRkRScSeFX\nP24OdvQoXHUV/LJ1P8VHtSfejjG792zKFNSRnSIiWcGZ9Mu6dE8hWcLJY/UXfnOM6g9dxYYjG/iy\n75dUK1nN72giIpJK2iArqfbgg/Dmm46644aw/PBC3ur6FpdXvtzvWCIikgZne8peySHefhvuvx/q\njh7HcvcmDzZ/kN51evsdS0RE0uhMCv/OdE8hmdrixTBwIFTr8RbLi41jQNQA7m56t9+xRETkDKRY\n+O20g7Kdcy1TGkeyj19/hS5doHTDb/it1mCaVW7GSx1e0rH6IiJZVGpa/AvM7AYzqxj8pJlFmFkL\nM3sD6J8x8cRP+/dD+/ZwovAGDnXoSuVilXm/x/tEhEX4HU1ERM5QanbuawMMAqabWRXgAJAXCAPm\nAk8755bsTmRRAAAgAElEQVRlXETxw/Hj3iV2f92+n7L3tueQc8zqNYvi+Yr7HU1ERM5Cas7VfwSY\nCEw0s3CgJHDYOXcgo8OJP5yDG26A+V8fo/qEq9lwZCPz+s3jvOLn+R1NRETOUpoO53POHQd2ZFAW\nySSeew5eeslR955RLD+ygDe6vMFllS7zO5aIiKQDHc4n/zB7NvznP1Br6DMsz/0yd116F/3q9vM7\nloiIpBOdwEdOWb0arrkGKl35OWvK30LXC7vyYIsH/Y4lIiLpSIVfANizBzp1gojyq9l9+bXUKVGH\nN7u+SS5Tp5CISHaib3Xh+HHo3h227ttNngEdKZinAJ9c+wkFIgr4HU1ERNJZqgq/mVU1s1lmli/o\nuQfMbHDGRZNQufFG78I7Ve64mn3Hd/DxtR9ToUgFv2OJiEgGSFXhd879CnwEzDOzEmb2HFAVmJKa\n15vZa2a2y8xWJTNOMzOLNbPVZvZ1aqYrZ+/FF2HSJEedO6/n5yPf8Fqn12hUrpHfsUREJIOkuqvf\nOfcy8ALwK1AQ6OOci0/ly6fgnQgoUWZWFO9cAZ2cczWB7qnNJWduwQLveP0aA59nRe5XuOvSu+hZ\nu6ffsUREJAOluvAHTt7THZgNNAAqpfa1zrlFwL5kRukFfOCc+z0w/q7UTlvOzG+/eWfmK9d0Hj9X\n/g8dL+ioPfhFRHKA1G7jL4hX8L91zvUErgdmmVnNdMpxAVDMzBaaWYyZ6cDxDHTwIHTu7J2D/89W\nPahWshrTrpqmPfhFRHKA1B7Olw+Y5JybCeCc+8bMegOF0zFHA+CKwLy+M7PvnXPrTx/RzIYBwwAq\nVqx4+mBJQUIC9OsHqzf8RYVxnTiI8UnPTyiUp5Df0UREJARSVfidc7uBmac9F5uOObYCe51zh4BD\nZrYIqAv8q/A75yYDkwGio6NdOmbIEcaPhw8/SqDmg31Yd2Q9X/b9knOLnet3LBERCZHM0rf7MXCp\nmeU2s/zARcBanzNlOx9/DPffD3VuHMvqE5/yVOunaF6lud+xREQkhEJy5j4zmw40A0qa2VbgfiAc\nwDk3yTm31szmACuABOAV51ySh/5J2q1eDX36QNWOH7Ci2IMMjBrIqEaj/I4lIiIhZs5l3d7y6Oho\nt2TJEr9jZHr790OjRrA/fBWHezemdplafD3ga/LkzuN3NBERSSMzi3HORZ/p69NyOJ+ZWR8zuy/w\nuKKZ6UwvmVx8PPTuDZt27iPPgM4UyVuYD675QEVfRCSHSss2/onAxcDJM7z8jXdCH8nE7r8fZs+J\n5/w7e7Ln2FY+uOYDIgtF+h1LRER8kpZt/Bc55+qb2TIA59x+M4vIoFySDj74ACZMgLo338PyY3N5\nuePLNC7f2O9YIiLio7S0+I+bWRjgAMysFN6OeJIJrVkD/fvDeZ1nsrzwI4xoMIIh9Yf4HUtERHyW\nlsL/LPAhUNrMJgCLgYcyJJWclQMHoEsXyFN+NdsbDuDi8hfzTNtn/I4lIiKZQKq7+p1z08wsBu/s\negZ0cc7pWPtM5uSZ+X7bfoBz7utCeFghZvaYSUSYtsqIiEgaj+N3zq0D1mVQFkkHDz0En36WQM3x\nfVh/dDML+i/QznwiInJKqgv/ycP4TueceyD94sjZmDMH7rsPao96gJXHZzGx3USaVGzidywREclE\n0tLiPxR0Py/QAZ1WN9PYuBF69YJKLWexssQ4BkQNYET0CL9jiYhIJpOWbfz/DX5sZk8AX6R7Ikmz\nw4fhqqvgROFf2desD1HFo5jYbiJm5nc0ERHJZM7mIj35gfLpFUTOjHNw3XUQuzqOkiOvJiyX8UGP\nD8gXns/vaCIikgmlZRv/SgLH8ANhQClA2/d99vLL8MYbjjr3D2fl4RXM6jWLKsWq+B1LREQyqbRs\n4+8QdP8EsNM5dyKd80gaLFkCN9wA1ftPZIW9xbhm42h7flu/Y4mISCaWlm38mzMyiKTN3r3QrRsU\nr/M9G6r+h3ZV23HPZff4HUtERDK5FAu/mf3N/3fx/2MQ4JxzhdM9lSTr5BX3th/YQ/HrelAubzne\n7PomuexsdtkQEZGcIMXC75wrFIogknoPPghfzI2nxoTebDi+k1l9/0fxfMX9jiUiIllAms7cZ2bF\ngPPxjuMHwDm3KL1DSdK++AIeeADq3vgAy4/NZXKHyTSIbOB3LBERySLSslf/EGA03iF8sUBj4Dug\nRcZEk9Nt2eJ18Ve6YjYrij1I/7r9dcU9ERFJk7RsFB4NNAQ2O+eaA/WAAxmSSv7l2DHo0QOO5NnM\ngRZ9qF2mNhPb6yQ9IiKSNmkp/Eecc0cAzCxP4II9F2ZMLDnd7bfD9z8do+zoHsRznJndZ5I/PL/f\nsUREJItJyzb+rWZWFPgI+NLM9gM6xC8EZs6EZ56BunfcyvLDPzKz+0zOL3G+37FERCQLSs3hfC8A\nbzvnugaeGmtmC4AiwJyMDCfwyy8waBCc3/k9lud9jtEXjebqGlf7HUtERLKo1LT41wNPmFlZ4F1g\nunPu64yNJeBdfKdbN8hVaj07Gg2mcZnGPNbyMb9jiYhIFpbiNn7n3DPOuYuBy4G9wGtmts7M7jez\nCzI8YQ42ejSsWHOY4sO7E5E7nBndZhARFuF3LBERycJSvXOfc26zc+5R51w9oCfQBVibYclyuGnT\nvAvw1LnjBjYeXsFbXd+iYpGKfscSEZEsLtWF38xym1lHM5sGzAZ+Bq7KsGQ52Lp1MHw4XND9TVbk\nfpU7L71TF98REZF0kZqd+1ritfDbAT8C7wDDnHOHMjhbjhQXB927Q0S5tWypO4KmkU15oLmufiwi\nIukjNTv33Qm8DdzinNufwXlyvBtugFU/x1F5fA9yWwGmXz2d3LnSdGZlERGRJKXmIj06JW+IvPkm\nvPYa1L3vBlYcXs2cPnMoV7ic37FERCQb0XVcM4l16+C66+DCHlNZnus17mp6F62qtvI7loiIZDPq\nQ84EDh/2zsMfXnYdv9e5jsvKXcbYZmP9jiUiItmQWvyZwH/+AyvXHqbo0B4UiMjP21e9re36IiKS\nIVRdfDZjBrz0EkTd8x9iD6/k816fa7u+iIhkGLX4fbRhAwwdChd0fZfY3C9x+yW363h9ERHJUGrx\n++ToUbjmGrASv7IjeiiNyzRmfIvxfscSEZFsTi1+n9x5JyxdfpRS111DWFgu3rn6HcLDwv2OJSIi\n2VxICr+ZvWZmu8xsVQrjNTSzE2bWLRS5/PLZZ/DUU1D31jv59XAMr3d+nUpFK/kdS0REcoBQtfin\nAG2SG8HMwoBHgbmhCOSXbdtgwACo0moWy/M9xaiGo+hSrYvfsUREJIcISeF3zi0C9qUw2g3A+8Cu\njE/kj/h46N0b4sK2c6D5AOqWqcvjrR73O5aIiOQgmWIbv5mVA7oCL/qdJSNNmABfL4qn8s19OJoQ\nx4xuM8ibO6/fsUREJAfJFIUfeBoY45xLSGlEMxtmZkvMbMnu3btDEC19fPMNjBsHdUc9zNojC3i+\n7fNcWPJCv2OJiEgOY8650MzIrDLwmXOuViLDNgIWeFgSiMO79O9HyU0zOjraLVmyJJ2Tpr/9+6Fu\nXUgo/y1/tLmca2pdw1td38LMUn6xiIhIEDOLcc5Fn+nrM8Vx/M65Kifvm9kUvB8IyRb9rMI57yQ9\n2/fvp9T1vaicrzIvtn9RRV9ERHwRksJvZtOBZkBJM9sK3A+EAzjnJoUig19efhnef99R+8FhrD22\nnU/6/I/CeQr7HUtERHKokBR+51zPNIw7IAOjhNTq1TB6NFTv8yor42fy6JWP0rBcQ79jiYhIDpYp\nuvqzoyNHoGdPyFdxLZuqjebKildy6yW3+h1LRERyuMyyV3+2c/vtsHLtEYoN6UmBiPxM7TKVXKbV\nLSIi/lKLPwPMmgXPPQdRd95BbNxyPu35KWULlfU7loiIiFr86W3HjpOn5P2c2DzPcEOjG+hwQQe/\nY4mIiABq8aerhASv6B90O3HNB1K7SG0ea/mY37FEREROUYs/HT3zDMyd66h6y0AOxf/F9Kun65S8\nIiKSqajFn06WLYMxY6DWkOdYdWw2z7d9npqla/odS0RE5B9U+NNBXBz06gVFL1jJL5Vup0PVDoxs\nONLvWCIiIv+irv50cOutsG7DYQr070XRvEV5tdOrOiWviIhkSmrxn6VPP4UXX4R6d41hWdwq5vSe\nQ+kCpf2OJSIikii1+M/CH3/A4MFQpdVslkU8x+iLRtP6vNZ+xxIREUmSWvxnyDkYOBD+it9FQuDQ\nvUeufMTvWCIiIslSi/8MPf88zJnjOP/WIRw8cYBpV03ToXsiIpLpqcV/Blavhttug1r9J7Pq2Kc8\n1fopapep7XcsERGRFKnwp9HRo9C7N+Sv+DO/nv8fWlZsyY0X3eh3LBERkVRRV38a3XsvLF95nBJD\ne5MvPB9TukzRVfdERCTLUIs/DRYuhCeegHo3j2NZXAzv93ifyEKRfscSERFJNRX+VDpwAPr1g3IX\nf8vywg8zsO5Arqp+ld+xRERE0kR91Kl0/fWwbc9fJHTuS6UilXimzTN+RxIREUkztfhTYfp0ePtt\nqDf2JpYf2cyiaxdRKE8hv2OJiIikmVr8KdiyBUaOhAs6f8AyXueOJnfQpGITv2OJiIicEbX4k5GQ\n4J2d72jEDnY3Hkb94vW5v9n9fscSERE5Y2rxJ+O55+CrrxxV/zOYw/GHeKvrW0SERfgdS0RE5Iyp\nxZ+ENWtgzBioPWAyK4/O5tk2z1K9VHW/Y4mIiJwVFf5EHDsGffpA/vK/sOG8m7my4pVc3+h6v2OJ\niIicNXX1J+KBB2DZ8hOUGt6PPLkjeL3z6zo7n4iIZAtq8Z/mu+/g4Yeh/g2PsjTue96+6m3KFy7v\ndywREZF0ocIf5OBB6NsXykQtZUWJsVxT/Rp61u7pdywREZF0o/7rILffDr9uPkKea/tSukBpJraf\n6HckERGRdKUWf8AXX8CLL0KDu+4mJm4Nc3rPoXi+4n7HEhERSVdq8QP79sGgQVDp8q9ZGvEU10Vf\nR+vzWvsdS0REJN2p8AOjRsHOA39zvN0Azi12Lo+3fNzvSCIiIhkix3f1z5jhXYSnwbibWXbkd77p\n+Q0FIgr4HUtERCRD5OgW/44dgQvwtJ9FjHuF2y65jUsqXOJ3LBERkQyTY1v8zsGwYXAoYS+5mg6h\nduHajGs2zu9YIiIiGSrHFv7XX4fPPoN6E65n1bG9zOs6hzy58/gdS0REJEPlyMK/eTPcdBPU6D6D\nZcdnML75eOqeU9fvWCIiIhkuJNv4zew1M9tlZquSGN7bzFaY2Uoz+5+ZZVgVTkjwDt2Lz/cH2+uP\npFG5Roy5dExGzU5ERCRTCdXOfVOANskM3whc7pyrDTwITM6oIBMnwvz5jvNuHsqR+Dje6PIGuXPl\nyI4PERHJgUJS8Zxzi8yscjLD/xf08HsgQ66K88sv3ml56/R7gxVHPuPJVk9SrWS1jJiViIhIppQZ\nD+cbDMxOaqCZDTOzJWa2ZPfu3ameaHw89O8PESW3sPHC0VxW6TJGNx6dHnlFRESyjExV+M2sOV7h\nT3Kju3NusnMu2jkXXapUqVRP+8kn4bvvHBVGDSaBeF7v/Dq5LFMtvoiISIbLNBu3zawO8ArQ1jm3\nNz2nvWYN3HsvRA15idjDXzKx3UTOLXZues5CREQkS8gUhd/MKgIfAH2dc+vTc9onTsCAAZA/ciPr\nK9/KlRWvZET0iPSchYiISJYRksJvZtOBZkBJM9sK3A+EAzjnJgH3ASWAiWYGcMI5F50e8370Ufhp\nSQI1Hx3E7ydy8WqnVwnMQ0REJMcJ1V79PVMYPgQYkt7zXb4cxo2D+sMnsjRuIa90fIWKRSqm92xE\nRESyjEzR1Z8Rjh/3uvgLV97AuvJjaFO5DYPqDfI7loiIiK+y7W7tDz0EscsTKD1sIOFh4bzc8WV1\n8YuISI6XLVv8sbEwfjzUv+5Zlh5azJTOUyhfOEPOCSQi4ovjx4+zdetWjhw54ncUySB58+alfPny\nhIeHp+t0s13hP3bMO1FPkXN/YW3kXbSv0p5+dfv5HUtEJF1t3bqVQoUKUblyZfVmZkPOOfbu3cvW\nrVupUqVKuk4723X1T5gAK1bGU3roQPLkzsPkjpP1TyEi2c6RI0coUaKEvt+yKTOjRIkSGdKjk61a\n/MuWedv2G4x8jphD3/JGlzeILBTpdywRkQyhop+9ZdT7m21a/MeOeXvxF636C2vK3kX789vTt05f\nv2OJiGRrf/zxB9deey1Vq1alQYMGtGvXjvXr034etqeffpq4uLhTj9u1a8eBAwfSM2qGOD332Y4X\nCtmm8Htd/AmUHjJIXfwiIiHgnKNr1640a9aMX3/9lZiYGB5++GF27tyZ5mmdXhg///xzihYtmp5x\nM4QKv09iY70u/uiRz7Hm0GKebv20uvhFRDLYggULCA8PZ8SI/z8Net26dbn00ku57bbbqFWrFrVr\n12bGjBkALFy4kGbNmtGtWzeqVatG7969cc7x7LPPsn37dpo3b07z5s0BqFy5Mnv27GHTpk1Ur16d\noUOHUrNmTVq1asXhw4cBaNasGUuWLAFgz549VK5cGfD2fxg4cCC1a9emXr16LFiwAIApU6YwatSo\nU1k7dOjAwoULiY+PZ8CAAafyPvXUU/9a1kOHDtG+fXvq1q1LrVq1mDFjRqK5r7vuOqKjo6lZsyb3\n338/QKLjzZ07l4svvpj69evTvXt3Dh48mG7vS0qy/Db+kyfqKVJlA6vL3qm9+EUkx7npJq8BlJ6i\nouDpp5MfZ9WqVTRo0OBfz3/wwQfExsayfPly9uzZQ8OGDbnssssAWLZsGatXryYyMpImTZrw7bff\ncuONN/Lkk0+yYMECSpYs+a/p/fLLL0yfPp2XX36ZHj168P7779OnT58kc73wwguYGStXrmTdunW0\natUq2c0PsbGxbNu2jVWrVgEkuolhzpw5REZGMmvWLAD+/PNPihQp8q/cEyZMoHjx4sTHx3PFFVew\nYsWKfy3fnj17GD9+PPPmzaNAgQI8+uijPPnkk9x3333JrO30k+Vb/A8/DMtXJFBm2GAiwiJ4qcNL\n6uIXEfHR4sWL6dmzJ2FhYZQpU4bLL7+cn376CYBGjRpRvnx5cuXKRVRUFJs2bUpxelWqVCEqKgqA\nBg0apPiaxYsXn/phUK1aNSpVqpRs4T/33HP57bffuOGGG5gzZw6FCxf+1zi1a9fmyy+/ZMyYMXzz\nzTcUKVIk0Wm9++671K9fn3r16rF69WrWrFnzr3G+//571qxZQ5MmTYiKiuKNN95g8+bNyS5TesrS\nLf7Dh70T9TQY8SIxhxbxaqdXKVe4nN+xRERCKqWWeUapWbMmM2fOTNNr8uTJc+p+WFgYJ06cSPNr\nTnb1586dm4SEBIBUHfYWPH7wa4oVK8by5cv54osvmDRpEu+++y7jxo2jY8eOAIwYMYIRI0awdOlS\nPv/8c+655x6uuOKKf7XQN27cyBNPPMFPP/1EsWLFGDBgQKK5nHO0bNmS6dOnp5g5I2TpFv+mTVC4\n4kbWlhtD66qtGRg10O9IIiI5RosWLTh69CiTJ08+9dyKFSsoWrQoM2bMID4+nt27d7No0SIaNWqU\n7LQKFSrE33//nab5V65cmZiYGIB//ABp2rQp06ZNA2D9+vX8/vvvXHjhhVSuXJnY2FgSEhLYsmUL\nP/74I+DtH5CQkMDVV1/N+PHjWbp0KRUqVCA2NpbY2FhGjBjB9u3byZ8/P3369OG2225j6dKl/8r9\n119/UaBAAYoUKcLOnTuZPXt2osvXuHFjvv32WzZs2AB4+w+cyZEQZypLt/jj4qDqiKFsOp5Le/GL\niISYmfHhhx9y00038eijj5I3b14qV67M008/zcGDB6lbty5mxmOPPcY555zDunXrkpzWsGHDaNOm\nDZGRkad2xkvJrbfeSo8ePZg8eTLt27c/9fzIkSO57rrrqF27Nrlz52bKlCnkyZOHJk2aUKVKFWrU\nqEH16tWpX78+ANu2bWPgwIGnegMefvjhf81r5cqV3HbbbeTKlYvw8HBefPHFRHPXq1ePatWqUaFC\nBZo0aZLk8k2ZMoWePXty9OhRAMaPH88FF1yQquU+W+acC8mMMkLhcyq5v6/7nUntJzE8erjfcURE\nQmbt2rVUr17d7xiSwRJ7n80sxjkXfabTzNJd/Ydyb6VFlRYMazDM7ygiIiJZQpYu/Dh4peMr6uIX\nERFJpSxd+M8vcT5ViqXvVYtERESysyxd+AtGFPQ7goiISJaSpQu/iIiIpI0Kv4iISA6iwi8iImck\nLCyMqKgoatWqRffu3VO8+lzBgt7m2e3bt9OtW7eznv+QIUNOnRL3oYceOuvpBZsyZQrbt29PdF5Z\nnQq/iIickXz58hEbG8uqVauIiIhg0qRJqXpdZGRkmk/1m5hXXnmFGjVqAGdW+OPj45McdnrhD55X\nVqfCLyIiZ61p06anTkH75JNPUqtWLWrVqsXTiVxIYNOmTdSqVQvwiu+tt95KrVq1qFOnDs899xzz\n58+nS5cup8b/8ssv6dq167+mc/KyvHfccQeHDx8mKiqK3r17A/DWW2/RqFEjoqKiGD58+KkiX7Bg\nQW655Rbq1q3Ld999xwMPPEDDhg2pVasWw4YNwznHzJkzWbJkCb179yYqKorDhw//4xLA06dPp3bt\n2tSqVYsxY8acylOwYEHuvvtu6tatS+PGjdm5c2c6rd30laVP2SsiInDTnJuI/SN9r8sbdU4UT7dJ\n3dV/Tpw4wezZs2nTpg0xMTG8/vrr/PDDDzjnuOiii7j88supV69eoq+dPHkymzZtIjY2lty5c7Nv\n3z6KFSvGyJEj2b17N6VKleL1119n0KBBSc7/kUce4fnnnyc2cG3itWvXMmPGDL799lvCw8MZOXIk\n06ZNo1+/fhw6dIiLLrqI//73vwDUqFHj1MV2+vbty2effUa3bt14/vnneeKJJ4iO/ucJ8rZv386Y\nMWOIiYmhWLFitGrVio8++oguXbpw6NAhGjduzIQJE7j99tt5+eWXueeee1K1DkNJLX4RETkjJ1vZ\n0dHRVKxYkcGDB7N48WK6du1KgQIFKFiwIFdddRXffPNNktOYN28ew4cPJ3durx1avHhxzIy+ffvy\n1ltvceDAAb777jvatm2b6lxfffUVMTExNGzYkKioKL766it+++03wNsv4eqrrz417oIFC7jooouo\nXbs28+fPZ/Xq1clO+6effqJZs2aUKlWK3Llz07t3bxYtWgRAREQEHTp0AFJ3+WC/qMUvIpLFpbZl\nnt5ObuPPCAMHDqRjx47kzZuX7t27n/phkBrOOfr375/oxXby5s1LWFgY4F2Wd+TIkSxZsoQKFSow\nduzYVF3eNynh4eGnziSb2ksO+0EtfhERSTdNmzblo48+Ii4ujkOHDvHhhx/StGnTJMdv2bIlL730\n0qkiuW/fPsDbATAyMpLx48czcGDKl1wPDw/n+PHjAFxxxRXMnDmTXbt2nZrm5s2b//Wak0W+ZMmS\nHDx48B87HCZ1meBGjRrx9ddfs2fPHuLj45k+fTqXX355ivkyE7X4RUQk3dSvX58BAwbQqFEjwDsM\nLqnt+yeHr1+/njp16hAeHs7QoUMZNWoUAL1792b37t2pugrhsGHDqFOnDvXr12fatGmMHz+eVq1a\nkZCQQHh4OC+88AKVKlX6x2uKFi3K0KFDqVWrFueccw4NGzY8NWzAgAGMGDGCfPny8d133516vmzZ\nsjzyyCM0b94c5xzt27enc+fOaVpHfsvSl+WNjo52J/eyFBHJSXLCZXlHjRpFvXr1GDx4sN9RfJMR\nl+VVi19ERDKdBg0aUKBAgVN730v6UeEXEZFMJyYmxu8I2ZZ27hMREclBVPhFRLKorLyPlqQso95f\nFX4RkSwob9687N27V8U/m3LOsXfvXvLmzZvu09Y2fhGRLKh8+fJs3bqV3bt3+x1FMkjevHkpX758\nuk83JIXfzF4DOgC7nHO1EhluwDNAOyAOGOCcWxqKbCIiWVF4eDhVqlTxO4ZkQaHq6p8CtElmeFvg\n/MBtGPBiCDKJiIjkOCEp/M65RcC+ZEbpDEx1nu+BomZWNhTZREREcpLMsnNfOWBL0OOtgedEREQk\nHWW5nfvMbBje5gCAo2a2ys88OUBJYI/fIXIAreeMp3Wc8bSOQ+PCs3lxZin824AKQY/LB577F+fc\nZGAygJktOZvzFUvKtI5DQ+s542kdZzyt49Aws7O6SE1m6er/BOhnnsbAn865HX6HEhERyW5CdTjf\ndKAZUNLMtgL3A+EAzrlJwOd4h/JtwDucL+WLL4uIiEiahaTwO+d6pjDcAdefwaQnn1kiSQOt49DQ\nes54WscZT+s4NM5qPZtO9ygiIpJzZJZt/CIiIhICWbbwm1kbM/vZzDaY2R1+58kOzKyCmS0wszVm\nttrMRgeeL25mX5rZL4G/xfzOmtWZWZiZLTOzzwKPtY7TkZkVNbOZZrbOzNaa2cVax+nPzP4T+K5Y\nZWbTzSyv1vPZMbPXzGxX8KHqya1TM7szUAd/NrPWqZlHliz8ZhYGvIB3qt8aQE8zq+FvqmzhBHCL\nc64G0Bi4PrBe7wC+cs6dD3wVeCxnZzSwNuix1nH6egaY45yrBtTFW9dax+nIzMoBNwLRgWuwhAHX\novV8tqbw71PcJ7pOA9/P1wI1A6+ZGKiPycqShR9oBGxwzv3mnDsGvIN32l85C865HScvjuSc+5v/\na+/eQqQs4ziOf3+1aakdqGCxJBSyoCstKssKzQisyC7CEgQjwkvxQjrfGHQXEnQhhB2Eouyw1N4U\nnTTKzE7GChURaWqmKZ29sKhfF8+7OCxOe3DGafb9fW5255lnZp757zL/ed/nfZ5/+bA8lxLb9VW3\n9cAtnRnh+CBpGnAjsK6hOTFuEUmnA9cATwDY/tP2LyTG7dADnCKpB5gE7CVxPiZNtrhvFtNFwPO2\nD3ZaXM8AAAOlSURBVNveQVkZd9lwr9GtiT9b/LaZpOnAbGAr0Nuwr8I+oLdDwxovHgXuBv5paEuM\nW2cGcAB4qppOWSdpMolxS9n+HngE2AX8QNl/5Q0S53ZoFtMx5cJuTfzRRpKmAC8DK23/1nhftfQy\nS0HGSNJgeepPm/VJjI9ZD3AxsNb2bOAQQ043J8bHrppnXkT5onUOMFnS0sY+iXPrtSKm3Zr4R7zF\nb4yOpJMoSf9Z231V8/7BaonVzx87Nb5xYC5ws6SdlCmqayU9Q2LcSnuAPba3VrdfonwRSIxb6zpg\nh+0Dtv8C+oArSZzboVlMx5QLuzXxfwzMlDRD0gTKxQ39HR5T15Mkyrzol7bXNNzVDyyrfl8GvHq8\nxzZe2L7P9jTb0yn/t+/YXkpi3DK29wG7JQ0WMlkAfEFi3Gq7gDmSJlWfHQso1wUlzq3XLKb9wO2S\nJkqaAcwEPhruybp2Ax9JN1DmSk8EnrT9cIeH1PUkXQW8B2znyPzz/ZR5/heA84DvgMW2h158EqMk\naR6wyvZNks4iMW4ZSbMoF09OAL6lbAN+AolxS0laDdxGWRG0DbgLmELiPGaNW9wD+ylb3L9Ck5hK\negC4k/I3WGn7tWFfo1sTf0RERIxet57qj4iIiDFI4o+IiKiRJP6IiIgaSeKPiIiokST+iIiIGkni\njwigLAuqKq0NSPpc0uWSVkqaNILHjqhfRHRelvNFBJKuANYA82wflnQ2ZQ38B5TqaweHefzOkfSL\niM7LEX9EAEwFDto+DFAl8Fspe7BvlLQRQNJaSZ9UZwZWV20rjtLveklbJH0m6cWq/kNE/A/kiD8i\nBgszvU8prfoWsMH2u0OP5CWdafunqub328AK2wON/aqzBX3AQtuHJN0DTLT9UAfeWkQM0dPpAURE\n59n+Q9IlwNXAfGCDpHuP0nWxpOWUz46pwEXAwJA+c6r2zWULdyYAW9o19ogYnST+iADA9t/AJmCT\npO0cKQoCQFUEZBVwqe2fJT0NnHyUpxLwpu0l7R1xRIxF5vgjAkkXSprZ0DSLUgzkd+DUqu00Sm37\nXyX1Agsb+jf2+xCYK+n86rknS7qgneOPiJHLEX9EQKmo9pikMyhVvr4BlgNLgNcl7bU9X9I24Ctg\nN7C54fGPD+l3B/CcpInV/Q8CXx+n9xIR/yEX90VERNRITvVHRETUSBJ/REREjSTxR0RE1EgSf0RE\nRI0k8UdERNRIEn9ERESNJPFHRETUSBJ/REREjfwLmb4bRHmc6n8AAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "label = 'Policy iteration'\n", "fig, ax = plt.subplots(figsize=(8,5))\n", "ax.plot(-v_cont, label='Continuous-state')\n", "ax.plot(-results[label].v, label=label)\n", "ax.set_title('Comparison of discrete vs. continuous value functions')\n", "ax.ticklabel_format(style='sci', axis='y', scilimits=(0,0))\n", "ax.set_xlabel('State')\n", "ax.set_ylabel(r'Value $\\times\\ (-1)$')\n", "plt.legend(loc=4)\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In the following we try to reproduce Table 14.1 in Rust (1996), p.660,\n", "although the precise definitions and procedures there are not very clear." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The maximum absolute differences of $v$ from that by policy iteration:" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "571.657808034 \t(Value iteration)\n", "124.137626141 \t(Value iteration with span-based termination)\n", "0.0 \t(Policy iteration)\n", "44.2673484103 \t(Modified policy iteration)\n" ] } ], "source": [ "for label in labels:\n", " diff_pi = \\\n", " np.abs(results[label].v - results['Policy iteration'].v).max()\n", " print(diff_pi, '\\t' + '(' + label + ')')\n", " df[columns[2]].loc[label] = diff_pi" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Compute $\\lVert v - T(v)\\rVert$:" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "29.080024668 \t(Value iteration)\n", "27.7883386169 \t(Value iteration with span-based termination)\n", "1.7462298274e-10 \t(Policy iteration)\n", "6.59712753212 \t(Modified policy iteration)\n" ] } ], "source": [ "for label in labels:\n", " v = results[label].v\n", " diff_max = \\\n", " np.abs(v - ddp.bellman_operator(v)).max()\n", " print(diff_max, '\\t' + '(' + label + ')')\n", " df[columns[4]].loc[label] = diff_max" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Next we compute $\\overline{b} - \\underline{b}$\n", "for the three methods other than policy iteration, where\n", "$I$ is the number of iterations required to fulfill the termination condition, and\n", "$$\n", "\\begin{aligned}\n", "\\underline{b} &= \\frac{\\beta}{1-\\beta} \\min\\left[T(v^{I-1}) - v^{I-1}\\right], \\\\\\\\\n", "\\overline{b} &= \\frac{\\beta}{1-\\beta} \\max\\left[T(v^{I-1}) - v^{I-1}\\right].\n", "\\end{aligned}\n", "$$" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "26.4655743935 \t(Value iteration)\n", "1141.05130079 \t(Value iteration with span-based termination)\n", "267.494551734 \t(Modified policy iteration)\n" ] } ], "source": [ "for i in range(4):\n", " if labels[i] != 'Policy iteration':\n", " k = 20 if labels[i] == 'Modified policy iteration' else 0\n", " res = ddp.solve(method=methods[i], v_init=v_init, k=k,\n", " max_iter=results[labels[i]].num_iter-1)\n", " diff = ddp.bellman_operator(res.v) - res.v\n", " diff_span = (diff.max() - diff.min()) * ddp.beta / (1 - ddp.beta)\n", " print(diff_span, '\\t' + '(' + labels[i] + ')')\n", " df[columns[3]].loc[labels[i]] = diff_span" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For policy iteration, while it does not seem really relevant,\n", "we compute $\\overline{b} - \\underline{b}$ with the returned value of $v$\n", "in place of $v^{I-1}$:" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "3.87080945075e-09 \t(Policy iteration)\n" ] } ], "source": [ "label = 'Policy iteration'\n", "v = results[label].v\n", "diff = ddp.bellman_operator(v) - v\n", "diff_span = (diff.max() - diff.min()) * ddp.beta / (1 - ddp.beta)\n", "print(diff_span, '\\t' + '(' + label + ')')\n", "df[columns[3]].loc[label] = diff_span" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Last, time each algorithm:" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Value iteration\n", "100 loops, best of 3: 4.54 ms per loop\n", "Value iteration with span-based termination\n", "100 loops, best of 3: 4.64 ms per loop\n", "Policy iteration\n", "1000 loops, best of 3: 1.29 ms per loop\n", "Modified policy iteration\n", "1000 loops, best of 3: 1.62 ms per loop\n" ] } ], "source": [ "for i in range(4):\n", " k = 20 if labels[i] == 'Modified policy iteration' else 0\n", " print(labels[i])\n", " t = %timeit -o ddp.solve(method=methods[i], v_init=v_init, epsilon=epsilon, k=k)\n", " df[columns[1]].loc[labels[i]] = t.best" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
IterationsTime (second)$\\lVert v - v_{\\mathrm{pi}} \\rVert$$\\overline{b} - \\underline{b}$$\\lVert v - T(v)\\rVert$
Value iteration1140.00454162571.65826.465629.08
Value iteration with span-based termination650.00463885124.1381141.0527.7883
Policy iteration50.0012928403.87081e-091.74623e-10
Modified policy iteration60.0016175644.2673267.4956.59713
\n", "
" ], "text/plain": [ " Iterations Time (second) \\\n", "Value iteration 114 0.00454162 \n", "Value iteration with span-based termination 65 0.00463885 \n", "Policy iteration 5 0.00129284 \n", "Modified policy iteration 6 0.00161756 \n", "\n", " $\\lVert v - v_{\\mathrm{pi}} \\rVert$ \\\n", "Value iteration 571.658 \n", "Value iteration with span-based termination 124.138 \n", "Policy iteration 0 \n", "Modified policy iteration 44.2673 \n", "\n", " $\\overline{b} - \\underline{b}$ \\\n", "Value iteration 26.4656 \n", "Value iteration with span-based termination 1141.05 \n", "Policy iteration 3.87081e-09 \n", "Modified policy iteration 267.495 \n", "\n", " $\\lVert v - T(v)\\rVert$ \n", "Value iteration 29.08 \n", "Value iteration with span-based termination 27.7883 \n", "Policy iteration 1.74623e-10 \n", "Modified policy iteration 6.59713 " ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Notes" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "It appears that our value iteration with span-based termination is different in some details\n", "from the corresponding algorithm (successive approximation with error bounds) in Rust.\n", "In returing the value function, our algorithm returns\n", "$T(v^{I-1}) + (\\overline{b} + \\underline{b})/2$,\n", "while Rust's seems to return $v^{I-1} + (\\overline{b} + \\underline{b})/2$.\n", "In fact:" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [], "source": [ "i = 1\n", "k = 0\n", "res = ddp.solve(method=methods[i], v_init=v_init, k=k,\n", " max_iter=results[labels[i]].num_iter-1)\n", "diff = ddp.bellman_operator(res.v) - res.v\n", "v = res.v + (diff.max() + diff.min()) * ddp.beta / (1 - ddp.beta) / 2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$\\lVert v - v_{\\mathrm{pi}}\\rVert$:" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "503.43001170444768" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.abs(v - results['Policy iteration'].v).max()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$\\lVert v - T(v)\\rVert$:" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "48.499617969646351" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.abs(v - ddp.bellman_operator(v)).max()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Compare the Table in Rust." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Convergence of trajectories" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let us plot the convergence of $v^i$ for the four algorithms;\n", "see also Figure 14.2 in Rust." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Value iteration" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "image/png": "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\nEQW/iIhIEvk/Mi0XsKPiN6wAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "label = 'Value iteration'\n", "iters = [2, 20, 40, 80]\n", "v = np.zeros(ddp.num_states)\n", "\n", "fig, ax = plt.subplots(figsize=(8,5))\n", "for i in range(iters[-1]):\n", " v = ddp.bellman_operator(v)\n", " if i+1 in iters:\n", " ax.plot(-v, label='Iteration {0}'.format(i+1))\n", "ax.plot(-results['Policy iteration'].v, label='Fixed Point')\n", "\n", "ax.ticklabel_format(style='sci', axis='y', scilimits=(0,0))\n", "ax.set_ylim(0, 2.4e5)\n", "ax.set_yticks([0.4e5 * i for i in range(7)])\n", "ax.set_title(label)\n", "ax.set_xlabel('State')\n", "ax.set_ylabel(r'Value $\\times\\ (-1)$')\n", "plt.legend(loc=(0.7, 0.2))\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Value iteration with span-based termination" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "label = 'Value iteration with span-based termination'\n", "iters = [1, 10, 15, 20]\n", "v = np.zeros(ddp.num_states)\n", "\n", "fig, ax = plt.subplots(figsize=(8,5))\n", "for i in range(iters[-1]):\n", " u = ddp.bellman_operator(v)\n", " if i+1 in iters:\n", " diff = u - v\n", " w = u + ((diff.max() + diff.min()) / 2) * ddp.beta / (1 - ddp.beta)\n", " ax.plot(-w, label='Iteration {0}'.format(i+1))\n", " v = u\n", "ax.plot(-results['Policy iteration'].v, label='Fixed Point')\n", "\n", "ax.ticklabel_format(style='sci', axis='y', scilimits=(0,0))\n", "ax.set_ylim(1.0e5, 2.4e5)\n", "ax.set_yticks([1.0e5+0.2e5 * i for i in range(8)])\n", "ax.set_title(label)\n", "ax.set_xlabel('State')\n", "ax.set_ylabel(r'Value $\\times\\ (-1)$')\n", "plt.legend(loc=(0.7, 0.2))\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Policy iteration" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "label = 'Policy iteration'\n", "iters = [1, 2, 3]\n", "v_init = np.zeros(ddp.num_states)\n", "\n", "fig, ax = plt.subplots(figsize=(8,5))\n", "sigma = ddp.compute_greedy(v_init)\n", "for i in range(iters[-1]):\n", " # Policy evaluation\n", " v_sigma = ddp.evaluate_policy(sigma)\n", " if i+1 in iters:\n", " ax.plot(-v_sigma, label='Iteration {0}'.format(i+1))\n", " # Policy improvement\n", " new_sigma = ddp.compute_greedy(v_sigma)\n", " sigma = new_sigma\n", "ax.plot(-results['Policy iteration'].v, label='Fixed Point')\n", "\n", "ax.ticklabel_format(style='sci', axis='y', scilimits=(0,0))\n", "ax.set_ylim(1e5, 4.2e5)\n", "ax.set_yticks([1e5 + 0.4e5 * i for i in range(9)])\n", "ax.set_title(label)\n", "ax.set_xlabel('State')\n", "ax.set_ylabel(r'Value $\\times\\ (-1)$')\n", "plt.legend(loc=4)\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Modified policy iteration" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "label = 'Modified policy iteration'\n", "iters = [1, 2, 3, 4]\n", "v = np.zeros(ddp.num_states)\n", "k = 20 #- 1\n", "\n", "fig, ax = plt.subplots(figsize=(8,5))\n", "for i in range(iters[-1]):\n", " # Policy improvement\n", " sigma = ddp.compute_greedy(v)\n", " u = ddp.bellman_operator(v)\n", " if i == results[label].num_iter-1:\n", " diff = u - v\n", " break\n", " # Partial policy evaluation with k=20 iterations\n", " for j in range(k):\n", " u = ddp.T_sigma(sigma)(u)\n", " v = u\n", " if i+1 in iters:\n", " ax.plot(-v, label='Iteration {0}'.format(i+1))\n", "ax.plot(-results['Policy iteration'].v, label='Fixed Point')\n", "\n", "ax.ticklabel_format(style='sci', axis='y', scilimits=(0,0))\n", "ax.set_ylim(0, 2.8e5)\n", "ax.set_yticks([0.4e5 * i for i in range(8)])\n", "ax.set_title(label)\n", "ax.set_xlabel('State')\n", "ax.set_ylabel(r'Value $\\times\\ (-1)$')\n", "plt.legend(loc=4)\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Increasing the discount factor" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let us consider the case with a discount factor closer to $1$, $\\beta = 0.9999$." ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [], "source": [ "ddp.beta = 0.9999" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [], "source": [ "v_init = np.zeros(ddp.num_states)\n", "epsilon = 1164\n", "ddp.max_iter = 10**5 * 2\n", "\n", "results_9999 = {}\n", "\n", "for i in range(4):\n", " k = 20 if labels[i] == 'Modified policy iteration' else 0\n", " results_9999[labels[i]] = \\\n", " ddp.solve(method=methods[i], v_init=v_init, epsilon=epsilon, k=k)" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [], "source": [ "df_9999 = pd.DataFrame(index=labels, columns=columns)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The numbers of iterations:" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "118900 \t(Value iteration)\n", "288 \t(Value iteration with span-based termination)\n", "7 \t(Policy iteration)\n", "18 \t(Modified policy iteration)\n" ] } ], "source": [ "for label in labels:\n", " print(results_9999[label].num_iter, '\\t' + '(' + label + ')')\n", " df_9999[columns[0]].loc[label] = results_9999[label].num_iter" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Policy iteration gives the optimal policy:" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1\n", " 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1]\n" ] } ], "source": [ "print(results_9999['Policy iteration'].sigma)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Takes action 1 (\"replace\") if and only if $s \\geq \\bar{\\gamma}$, where $\\bar{\\gamma}$ is equal to:" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "43" ] }, "execution_count": 40, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(1-results_9999['Policy iteration'].sigma).sum()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Check that the other methods gave the correct answer:" ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "True\n", "True\n", "True\n" ] } ], "source": [ "for result in results_9999.values():\n", " if result != results_9999['Policy iteration']:\n", " print(np.array_equal(result.sigma, results_9999['Policy iteration'].sigma))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$\\lVert v - v_{\\mathrm{pi}}\\rVert$:" ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "581.99877359 \t(Value iteration)\n", "4.37768544257 \t(Value iteration with span-based termination)\n", "0.0 \t(Policy iteration)\n", "4.45490047336 \t(Modified policy iteration)\n" ] } ], "source": [ "for label in labels:\n", " diff_pi = \\\n", " np.abs(results_9999[label].v - results_9999['Policy iteration'].v).max()\n", " print(diff_pi, '\\t' + '(' + label + ')')\n", " df_9999[columns[2]].loc[label] = diff_pi" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$\\lVert v - T(v)\\rVert$:" ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.0581999123096 \t(Value iteration)\n", "0.0558041036129 \t(Value iteration with span-based termination)\n", "4.47034835815e-08 \t(Policy iteration)\n", "0.052891805768 \t(Modified policy iteration)\n" ] } ], "source": [ "for label in labels:\n", " v = results_9999[label].v\n", " diff_max = \\\n", " np.abs(v - ddp.bellman_operator(v)).max()\n", " print(diff_max, '\\t' + '(' + label + ')')\n", " df_9999[columns[4]].loc[label] = diff_max" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$\\overline{b} - \\underline{b}$:" ] }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.000446990132332 \t(Value iteration)\n", "1160.37530656 \t(Value iteration with span-based termination)\n", "1099.68602686 \t(Modified policy iteration)\n" ] } ], "source": [ "for i in range(4):\n", " if labels[i] != 'Policy iteration':\n", " k = 20 if labels[i] == 'Modified policy iteration' else 0\n", " res = ddp.solve(method=methods[i], v_init=v_init, k=k,\n", " max_iter=results_9999[labels[i]].num_iter-1)\n", " diff = ddp.bellman_operator(res.v) - res.v\n", " diff_span = (diff.max() - diff.min()) * ddp.beta / (1 - ddp.beta)\n", " print(diff_span, '\\t' + '(' + labels[i] + ')')\n", " df_9999[columns[3]].loc[labels[i]] = diff_span" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For policy iteration:" ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.000595986843109 \t(Policy iteration)\n" ] } ], "source": [ "label = 'Policy iteration'\n", "v = results_9999[label].v\n", "diff = ddp.bellman_operator(v) - v\n", "diff_span = (diff.max() - diff.min()) * ddp.beta / (1 - ddp.beta)\n", "print(diff_span, '\\t' + '(' + label + ')')\n", "df_9999[columns[3]].loc[label] = diff_span" ] }, { "cell_type": "code", "execution_count": 46, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Value iteration\n", "1 loop, best of 3: 4.63 s per loop\n", "Value iteration with span-based termination\n", "10 loops, best of 3: 20.3 ms per loop\n", "Policy iteration\n", "1000 loops, best of 3: 1.93 ms per loop\n", "Modified policy iteration\n", "100 loops, best of 3: 5 ms per loop\n" ] } ], "source": [ "for i in range(4):\n", " k = 20 if labels[i] == 'Modified policy iteration' else 0\n", " print(labels[i])\n", " t = %timeit -o ddp.solve(method=methods[i], v_init=v_init, epsilon=epsilon, k=k)\n", " df_9999[columns[1]].loc[labels[i]] = t.best" ] }, { "cell_type": "code", "execution_count": 47, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
IterationsTime (second)$\\lVert v - v_{\\mathrm{pi}} \\rVert$$\\overline{b} - \\underline{b}$$\\lVert v - T(v)\\rVert$
Value iteration1189004.62967581.9990.000446990.0581999
Value iteration with span-based termination2880.02030214.377691160.380.0558041
Policy iteration70.0019253700.0005959874.47035e-08
Modified policy iteration180.004997564.45491099.690.0528918
\n", "
" ], "text/plain": [ " Iterations Time (second) \\\n", "Value iteration 118900 4.62967 \n", "Value iteration with span-based termination 288 0.0203021 \n", "Policy iteration 7 0.00192537 \n", "Modified policy iteration 18 0.00499756 \n", "\n", " $\\lVert v - v_{\\mathrm{pi}} \\rVert$ \\\n", "Value iteration 581.999 \n", "Value iteration with span-based termination 4.37769 \n", "Policy iteration 0 \n", "Modified policy iteration 4.4549 \n", "\n", " $\\overline{b} - \\underline{b}$ \\\n", "Value iteration 0.00044699 \n", "Value iteration with span-based termination 1160.38 \n", "Policy iteration 0.000595987 \n", "Modified policy iteration 1099.69 \n", "\n", " $\\lVert v - T(v)\\rVert$ \n", "Value iteration 0.0581999 \n", "Value iteration with span-based termination 0.0558041 \n", "Policy iteration 4.47035e-08 \n", "Modified policy iteration 0.0528918 " ] }, "execution_count": 47, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_9999" ] }, { "cell_type": "code", "execution_count": 48, "metadata": { "scrolled": false }, "outputs": [ { "data": { "image/png": "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\nRK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAArMAAAFACAYAAACvCfQxAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xu4XXV95/H3xySUq1wCBEgs4Q4STCrxggqiqCjaUQot\neE+lVcYrtow6HR4m+tQZaC0iBi+IFGUAFQyCiIgoQtBiTEwId1FRCErQaJUg0JzwnT/2OmFz2Mk5\nSc4lC96v51nPXnut322tvZN88tu/fU6qCkmSJKmNnjbWA5AkSZLWl2FWkiRJrWWYlSRJUmsZZiVJ\nktRahllJkiS1lmFWkiRJrWWYlSRJUmsZZiVJktRahllJkiS11vixHoCkodl+++1r6tSpYz0MSZJG\nxcKFC39bVTsMVs4wK7XE1KlTWbBgwVgPQ5KkUZHkl0Mp5zIDSZIktZZhVpIkSa1lmJUkSVJrGWYl\nSZLUWoZZSZIktZZhVpIkSa1lmJUkSVJrGWYlSZLUWoZZSZIktZZhVpIkSa1lmJUkSVJrGWYlSZLU\nWoZZSZIktZZhVpIkSa1lmJUkSVJrparGegyShmDCJhOqb2XfWA/jSWHS5Enct/S+sR6GJGktkiys\nqpmDlRs/GoORtOH6VvbB7LEexZPDstnLxnoIkqRh4jIDSZIktZZhVpIkSa1lmJUkSVJrGWYlSZLU\nWoZZSZIktZZhVpIkSa1lmJUkSVJrGWYlSZLUWoZZSZIktZZhVpIkSa1lmJUkSVJrGWYlSZLUWoZZ\njYok1yQ5fMCxE5J8epB6K4ap/+OTvKXZn5Vkl+Fot2nv0CQv6NWXJEkaWePHegB6yrgQOBb4Vtex\nY4EPjEbnVfWZrqezgJuBXw21fpLxVdW3htOHAiuAH/ToS5IkjSBnZjVaLgZenWQTgCRTgV2AeUm2\nTPKdJD9OclOS1w6s3Mx+Xt71fE6SWc3+gUmuTbIwybeS7Nyj/uwkJyY5GpgJnJ9kcZLN1lQ/yfeS\nnJ5kAfC+JH+Z5IdJFiW5Osmk5jqOB97ftHdwf19NGzOS3JBkSZJLkmzb1fapSeYn+UmSg4ftTkuS\n9BTizKxGRVX9Lsl84FXApXRmZb9SVZXkYeDIqvpjku2BG5JcVlU1WLtJJgCfBF5bVb9JcgzwUeBt\naxjHxUneDZxYVQuGUH+TqprZ9LUt8PxmzH8HfKCq/jHJZ4AVVfWxptxhXV1+EXhPVV2b5CPA/wZO\naM6Nr6rnJjmiOf6yHtf3duDtqw/MHuyOaEjGQZKxHoUkaRgYZjWa+pca9IfZ45rjAf5PkkOAR4HJ\nwCTgviG0uQ8wDfh2E07GAb9ehzENVv/LXftTgC83M7ebAHetreEkWwPbVNW1zaEvABd1FZnbPC4E\npvZqo6rOAs5q2isYNN9rKFaN9QAkSYMb2qSDYVaj6VLg40meDWxeVQub428EdgAOrKqVSX4BbDqg\nbh+PXxbTfz7ALVV10HqOabD6D3btfxI4raouS3IoGz5P+kjzuAr/LEqStF5cM6tRU1UrgGuAc+jM\n0vbbGri/CbIvAXbtUf2XwDOT/FmSbYD+j/LvAHZIchB0lh0k2X+QoTwAbLUe9bcG7m3237qG9lar\nqj8Av+9aD/tm4NqB5SRJ0vozzGq0XQhM5/Fh9nxgZpKbgLcAtw+sVFX3AF+h81MIvgIsao7/F3A0\ncGqSG4HFwAsG1h/gXOAzSRbTWVYw1PqzgYuSLAR+23X868CR/V8AG1DnrcC/JlkCzAA+MsjYJEnS\nOsgQvmMjaSPgmllJ0lNLFvZ/CXttnJmVJElSaxlmJUmS1FqGWUmSJLWWYVaSJEmtZZiVJElSaxlm\nJUmS1FqGWUmSJLWWYVaSJEmtZZiVJElSaxlmJUmS1FqGWUmSJLXW+LEegKShGT9+E/r6MtbDkCRp\no2KYlVpi+vQDWLBgwVgPQ5KkUZEMbQLHZQaSJElqLcOsJEmSWsswK0mSpNYyzEqSJKm1DLOSJElq\nLcOsJEmSWsswK0mSpNYyzEqSJKm1DLOSJElqLcOsJEmSWsswK0mSpNYyzEqSJKm1DLOSJElqLcOs\nJEmSWsswK0mSpNYyzEqSJKm1DLOSJElqLcOsJEmSWsswK0mSpNYyzEqSJKm1DLOSJElqLcOsJEmS\nWsswK0mSpNYyzEqSJKm1DLOSJElqLcOsJEmSWsswK0mSpNYyzEqSJKm1DLOSJElqLcOsJEmSWssw\nK0mSpNYyzEqSJKm1UlVjPQZJQzBhkwnVt7JvrIfxpDJp8iTuW3rfWA9DktRDkoVVNXOwcuNHYzCS\nNlzfyj6YPdajeHJZNnvZWA9BkrSBXGYgSZKk1jLMSpIkqbUMs5IkSWotw6wkSZJayzArSZKk1jLM\nSpIkqbUMs5IkSWotw6wkSZJayzArSZKk1jLMSpIkqbUMs5IkSWotw6wkSZJaa61hNsk1SQ4fcOyE\nJJ8epN6K4RhckuOTvKXZn5Vkl+Fot2nv0CQv6NXXSEvyg+ZxapI3dB2flWTOaIxhqJr7dPko9veL\nJNv3OP5PI9jnLkku3oD6JyTZvOv5FUm2GZ7RSZKktRlsZvZC4NgBx45tjo+4qvpMVX2xeToLWKcw\nm2T8Wk4fCqwOswP6GlFV1d/vVOANaymqx6xzmE0ybijlqupXVXX0ug9ptROA1WG2qo6oqv/cgPYk\nSdIQDRZmLwZenWQT6Mwk0gmU85JsmeQ7SX6c5KYkrx1YeeCsXpI5SWY1+wcmuTbJwiTfSrJzj/qz\nk5yY5GhgJnB+ksVJNltT/STfS3J6kgXA+5L8ZZIfJlmU5Ookk5rrOB54f9Pewf19NW3MSHJDkiVJ\nLkmybVfbpyaZn+QnSQ7uMeYzk/y3Zv+SJOc0+29L8tFmv3/m+hTg4GYM72+O7ZLkyiR3JvmXXi9K\nklOS3NqM72PNsXOTfCbJgmZsr+l/zZLMa16nH/fPRjevzfeSXJzk9iTnJ0mv/oCnJ/lGkjuaPp7W\ntPHppr9bknx4kPHtkOSrSX7UbC9sjk9MclXTxtnAE8aQ5BRgs+Y+nd8ce1PzOixO8tn+4JpkRZJ/\nS3IjcFAz0/t/m3ILkjy7eb/8LMnxXffo5mZ/VpK5vV6DXteb5L10/kxck+Sa5tjq2eUk/5Dk5mY7\noau/25J8rmnrqiSbreHeS5KktamqtW7A5cBrm/0PAR9r9scDT2/2twd+CqR5vqJ5PBS4vKutOXRm\nWCcAPwB2aI4fA5zTo+/ZwInN/veAmc3+Gus35T7V1ca2XeP6O+DfBrbdo68lwIub/Y8Ap3e13V//\nCODqHmM+FvjXZn8+cEOz/+/A4YPcn1nAz4GtgU2BXwLPGND+ROCOrmvapnk8F7iSzn9Q9gKWNm1s\nDmzalNkLWNDV9x+AKU2d/wBe1ON6DgUeBnYHxgHfBo5uzm3XPI5r7s2z1jK+C/rbB/4cuK3ZPwM4\nudl/NVDA9j3GsaJrfz/g68CE5vmngLc0+wX8TVfZXwD/vdn/ePPabgXsACxrjk8Fbh7sNeh1vV19\nbD+gz+2BA4GbgC2ALYFbgL9o+usDZjTlvwK8aQ1//t4OLGi2chvmbdxGMAY3N7en3DZp0q6lwdFk\nlsG2tX0M369/qcGlzeNxzfEA/yfJIcCjwGRgEnDfENrcB5gGfLuZDBwH/HoI9YZa/8td+1OALzcz\nt5sAd62t4SRb0wlg1zaHvgBc1FVkbvO4kE4oGWgecEKSZwK3Ats2fR8EvHfQK4PvVNUfmrHcCuwK\n3NN1/g90wuXn05n17l7P+pWqehS4M8nPgX3pXO+cJDOAVcDeXeXnV9XSpq/FzfVc32NM86vq5025\nC4EX0Zm1/5skb6fzH5udgf5r7jW+lwHP7Jr8fXqSLYFDgL8CqKpvJPn9EO7RYXSC4o+a9jYD7m/O\nrQK+OqD8Zc3jTcCWVfUA8ECSR9J7beuaXoNe17tkLeN8EXBJVT3YtDUXOLgZz11Vtbgpt6b3ElV1\nFnBWU786fw9q2Kwa6wFIeipatmxNH4RqfQwlzF4KfDzJs4HNq2phc/yNdGa3DqyqlUl+QWcmq1sf\nj1/K0H8+wC1VddB6jnuw+g927X8SOK2qLktyKJ0Z2A3xSPO4ih73r6rubQLSK4HrgO2Av6Ezs/jA\nOrTfs4+q6kvyXDqB7mjg3cBL+08PHA7wfmAZMJ3Oa/Hw2vpK8jzgs82xk4E/9mo3yW7AicBzqur3\nSc6lMwO8pvE9DXh+VXX3z5pXNqxVgC9U1f/sce7hqhoYUfqv81Eef82P0vvPQK/70vN612fwa+jD\nZQaSJK2HQX80V1WtAK4BzuHxX/zaGri/CbIvoTN7NdAv6czG/VkT8A5rjt8B7JDkIIAkE5LsP8hQ\nHqDz8fC61t8auLfZf+sa2lutmZH7fR5bD/tm4NqB5QZxA50vBV1HZ6b2xOZxoJ5jWJtmNnPrqrqC\nTlCd3nX6r5M8LckedJYF3EHn+n/dzNi+mc4s9hpV1Q+rakaz9c9oPjfJbs1a2WPozN4+nc5/Gv6Q\nZBLwqkHGdxXwnq7rmNHsXkfzJbgkr6KzLKSXlUkmNPvfAY5OsmNTb7skvd5/w6nn9TbW9DrOA16X\nZPMkWwBH0vt9IEmS1tNQZmahE2Iv4fE/2eB84OtJbqKznu/2gZWq6p4kXwFupvNx96Lm+H+l86Wu\nM5qP9ccDp9NZU7gm5wKfSfIQnY/sh1p/NnBR8/H1d4HdmuNfBy5O54tr7xlQ561NX5vTWT/5t2sZ\nVy/zgFdU1U+T/JLO7GyvELMEWNV8WelcYCgfsW8FXJpkUzozlP/Qde5uOut0nw4cX1UPJ/kU8NV0\nfuzYlTx+1nqofkRnvfOedP5jc0lVPZpkEZ3X/R7g+4OM773AmUmW0Hm9rqPzJbwPAxcmuYXOOui7\n1zCGs4AlSX5cVW9MchJwVROwVwLvovOfpxFRVTeu4Xr7x3Zlkl9V1Uu66vy4mcGd3xw6u6oWpfMF\nREmSNAz6v6SjlmtC0+VVtd4/L1UbN9fMStKTRTB/DS7JwqqaOVg5fwOYJEmSWmuoywy0kauqWWM9\nBkmSpNHmzKwkSZJayzArSZKk1jLMSpIkqbUMs5IkSWotw6wkSZJayzArSZKk1jLMSpIkqbUMs5Ik\nSWotw6wkSZJay98AJrXE+PGb0NeXsR6GJGkDTZq061gP4UnFMCu1xPTpB7BgwYKxHoYkSRsVlxlI\nkiSptQyzkiRJai3DrCRJklrLMCtJkqTWMsxKkiSptQyzkiRJai3DrCRJklrLMCtJkqTWMsxKkiSp\ntQyzkiRJai3DrCRJklrLMCtJkqTWMsxKkiSptQyzkiRJai3DrCRJklrLMCtJkqTWMsxKkiSptQyz\nkiRJai3DrCRJklrLMCtJkqTWMsxKkiSptQyzkiRJai3DrCRJklrLMCtJkqTWMsxKkiSptQyzkiRJ\nai3DrCRJklrLMCtJkqTWMsxKkiSptQyzkiRJai3DrCRJklrLMCtJkqTWMsxKLXHjkhtJMiLbTlN2\nGuvLkyRpvYwf6wFIGpq+lX0we2TaXjZ72cg0LEnSCHNmVpIkSa1lmJUkSVJrGWYlSZLUWoZZSZIk\ntZZhVpIkSa1lmJUkSVJrGWYlSZLUWoZZSZIktZZhVpIkSa1lmJUkSVJrGWYlSZLUWoZZSZIktZZh\nVqMiyaoki5PcnOSiJJsPUn5F87hLkouHof+zkzyz2f+nDW1vQNuzkuzSqy9JkjSyDLMaLQ9V1Yyq\nmgb8F3D8UCpV1a+q6ugN7byq/q6qbm2ernOYTTJuLadnAavD7IC+JEnSCDLMaizMA/YESPIPzWzt\nzUlOGFgwydQkNzf745J8rCm7JMl7krw0yde6yr88ySU92vlekplJTgE2a2aJz2/OvSnJ/ObYZ/uD\na5IVSf4tyY3AQUlOTvKjpv+z0nE0MBM4v6m/WX9fTRuvT3JTU+fUrvGsSPLRJDcmuSHJpGG8v5Ik\nPWWMH+sB6KklyXjgVcCVSQ4E/hZ4HhDgh0murapFa6j+dmAqMKOq+pJsB/we+FSSHarqN01756yp\n/6r6UJJ3V9WMZjz7AccAL6yqlUk+BbwR+CKwBfDDqvrHpuytVfWRZv884DVVdXGSdwMnVtWC5lz/\nte4CnAoc2IzzqiSvq6qvNW3fUFX/K8m/AH8P/HOP+/X25ro7Zq/pyjbQuMfGPRSTJu3Kfff9YoQG\nI0nS0Dkzq9GyWZLFwALgbuDzwIuAS6rqwapaAcwFDl5LGy8DPltVfQBV9buqKuA84E1JtgEOAr65\nDuM6jE7Y/FEzvsOA3Ztzq4CvdpV9SZIfJrkJeCmw/yBtPwf4XlX9phnz+cAhzbn/Ai5v9hfSCelP\nUFVnVdXMqprZHBmZbdW6lV+27JeDXLokSaPDmVmNlof6Z0P7rctM4CD+Hfg68DBwUX/YHaIAX6iq\n/9nj3MNVtQogyabAp4CZVXVPktnAphsw5pVNEIdOaPbPoiRJ68GZWY2lecDrkmyeZAvgyObYmnwb\neEezVIFmmQFV9SvgV8BJdILtYFYmmdDsfwc4OsmO/W0m2bVHnf7g+tskWwLdX0p7ANiqR535wIuT\nbN+sw309cO0QxidJkobI2SCNmar6cZJz6YQ+gLPXsl4W4Gxgb2BJkpXA54A5zbnzgR2q6rYhdH1W\n08aPq+qNSU6is571acBK4F3A4z5Hr6r/TPI54GbgPuBHXafPBT6T5CE6yxz66/w6yYeAa+jMAH+j\nqi4dwvgkSdIQ5bFPOqX2SjIHWFRVnx/rsYyUJNVZs7oxCP7dIUkaSUkWPvadkTVzZlatl2Qh8CDw\nj2M9FkmSNLoMs2q9qjpwrMcgSZLGhl8AkyRJUmsZZiVJktRahllJkiS1lmFWkiRJrWWYlSRJUmsZ\nZiVJktRahllJkiS1lmFWkiRJrWWYlSRJUmv5G8Cklhg/fhP6+jLWwwBg0qRdx3oIkiQBhlmpNaZP\nP4AFCxaM9TAkSdqouMxAkiRJrWWYlSRJUmsZZiVJktRahllJkiS1lmFWkiRJrWWYlSRJUmsZZiVJ\nktRahllJkiS1lmFWkiRJrWWYlSRJUmsZZiVJktRahllJkiS1lmFWkiRJrWWYlSRJUmsZZiVJktRa\nhllJkiS1lmFWkiRJrWWYlSRJUmsZZiVJktRahllJkiS1lmFWkiRJrWWYlSRJUmsZZiVJktRahllJ\nkiS1lmFWkiRJrWWYlSRJUmsZZiVJktRahllJkiS1lmFWkiRJrWWYlSRJUmsZZiVJktRahllJkiS1\nVqpqrMcgaQgmbDKh+lb2jWqfkyZP4r6l941qn5IkASRZWFUzBys3fjQGI2nD9a3sg9mj2+ey2ctG\nt0NJktaRywwkSZLUWoZZSZIktZZhVpIkSa3lmllJkqQeVq5cydKlS3n44YfHeihPaptuuilTpkxh\nwoQJ61XfMCtJktTD0qVL2WqrrZg6dSpJxno4T0pVxfLly1m6dCm77bbberXhMgNJkqQeHn74YSZO\nnGiQHUFJmDhx4gbNfhtmJUmS1sAgO/I29B4bZiVJktRahllJkiS1lmFWkiRpI3fyySdzwAEHsPfe\ne3PWWWetVxtXXnkl++yzD3vuuSennHLKGst94hOfYNq0aey///6cfvrpq49PnTqVAw44gBkzZjBz\n5qC/ZXbUGGYlSZKGYKcpO5Fk2Ladpuw0pH6/9a1vsWjRIhYvXsxXv/pVvva1r63z2FetWsW73vUu\nvvnNb3Lrrbdy4YUXcuuttz6h3M0338znPvc55s+fz4033sjll1/OT3/609Xnr7nmGhYvXsyCBQvW\neQwjxR/NJUmSNATL7l0Gs4exvdnLhlTusssuY9asWaxcuZI5c+Zw1FFHrXNf8+fPZ88992T33XcH\n4Nhjj+XSSy/lmc985uPK3XbbbTzvec9j8803B+DFL34xc+fO5QMf+MA69zlanJltmSSV5P91PR+f\n5DdJLl/Hdn6RZPtm/wddx/81yS3N4/FJ3rKO7a5Yl/Jraed7SWY2+1ck2WYD21t9LUlmJdllOMbZ\ntHdokhf06kuSpA21cOFCHnjgASZOnMj111/P61//+sedP/jgg5kxY8YTtquvvnp1mXvvvZdnPOMZ\nq59PmTKFe++99wl9TZs2jXnz5rF8+XL+9Kc/ccUVV3DPPfcAnZ868LKXvYwDDzxwvZc6jARnZtvn\nQWBaks2q6iHg5cAT343roKpe0PX07cB2VbVqQ9ocTlV1xDC08Zmup7OAm4FfDbV+kvFV1beG04cC\nK4Af9OhLkqT19uijj7J06VJmzZrFMcccwzve8Q5OO+00TjrppNVl5s2bN2z97bfffnzwgx/kFa94\nBVtssQUzZsxg3LhxAFx//fVMnjyZ+++/n5e//OXsu+++HHLIIcPW9/pyZradrgBe3ey/Hriw/0SS\n7ZJ8LcmSJDckeVZzfGKSq5pZ17OBdNVZ0TxeBmwJLExyTJLZSU5szu2R5MokC5PMS7Jvc3y3JP+R\n5KYk/9xrsEmmJrk9yflJbktycZLNm3OHJVnU1D8nyZ/1qN89i/yW5tpuTHJekq2S3JVkQnP+6d3P\n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\nPkwUAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "df_time = pd.DataFrame(index=labels)\n", "df_time[r'$\\beta = 0.95$'] = df[columns[1]]\n", "df_time[r'$\\beta = 0.9999$'] = df_9999[columns[1]]\n", "second_max = df_time[r'$\\beta = 0.9999$'][1:].max()\n", "\n", "for xlim in [None, (0, second_max*1.2)]:\n", " ax = df_time.loc[reversed(labels)][df_time.columns[::-1]].plot(\n", " kind='barh', legend='reverse', xlim=xlim, figsize=(8,5)\n", " )\n", " ax.set_xlabel('Time (second)')" ] }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Darwin-16.5.0-x86_64-i386-64bit\n" ] } ], "source": [ "import platform\n", "print(platform.platform())" ] }, { "cell_type": "code", "execution_count": 50, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "3.6.1 |Anaconda 4.4.0 (x86_64)| (default, May 11 2017, 13:04:09) \n", "[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.57)]\n" ] } ], "source": [ "import sys\n", "print(sys.version)" ] }, { "cell_type": "code", "execution_count": 51, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1.12.1\n" ] } ], "source": [ "print(np.__version__)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.1" } }, "nbformat": 4, "nbformat_minor": 1 }