{ "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": { "collapsed": false }, "outputs": [], "source": [ "%matplotlib inline" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [], "source": [ "from __future__ import division, print_function\n", "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": "markdown", "metadata": {}, "source": [ "## Setup" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "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": 4, "metadata": { "collapsed": false }, "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": 5, "metadata": { "collapsed": false }, "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": 6, "metadata": { "collapsed": false }, "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": 7, "metadata": { "collapsed": false }, "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": 8, "metadata": { "collapsed": false }, "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": 9, "metadata": { "collapsed": false }, "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": 10, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def value_func_cont_time(s):\n", " return -c*gamma/(1-beta) + (s < gamma) * f(gamma, s)" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": false }, "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": 12, "metadata": { "collapsed": false }, "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": 13, "metadata": { "collapsed": false }, "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": 14, "metadata": { "collapsed": false }, "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": 15, "metadata": { "collapsed": false }, "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": 16, "metadata": { "collapsed": false }, "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": 17, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "53" ] }, "execution_count": 17, "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": 18, "metadata": { "collapsed": false }, "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": 19, "metadata": { "collapsed": false }, "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": 20, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\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": 21, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "571.657808034 \t(Value iteration)\n", "124.137626142 \t(Value iteration with span-based termination)\n", "0.0 \t(Policy iteration)\n", "44.2673484102 \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": 22, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "29.0800246681 \t(Value iteration)\n", "27.7883386169 \t(Value iteration with span-based termination)\n", "2.03726813197e-10 \t(Policy iteration)\n", "6.59712753215 \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": 23, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "26.4655743941 \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": 24, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "4.9767550081e-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": 25, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Value iteration\n", "100 loops, best of 3: 4.25 ms per loop\n", "Value iteration with span-based termination\n", "100 loops, best of 3: 4.62 ms per loop\n", "Policy iteration\n", "1000 loops, best of 3: 1.58 ms per loop\n", "Modified policy iteration\n", "1000 loops, best of 3: 1.38 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": 26, "metadata": { "collapsed": false }, "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", "
IterationsTime (second)$\\lVert v - v_{\\mathrm{pi}} \\rVert$$\\overline{b} - \\underline{b}$$\\lVert v - T(v)\\rVert$
Value iteration1140.00424717571.65826.465629.08
Value iteration with span-based termination650.00461827124.1381141.0527.7883
Policy iteration50.0015769504.97676e-092.03727e-10
Modified policy iteration60.0013790244.2673267.4956.59713
\n", "
" ], "text/plain": [ " Iterations Time (second) \\\n", "Value iteration 114 0.00424717 \n", "Value iteration with span-based termination 65 0.00461827 \n", "Policy iteration 5 0.00157695 \n", "Modified policy iteration 6 0.00137902 \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 4.97676e-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 2.03727e-10 \n", "Modified policy iteration 6.59713 " ] }, "execution_count": 26, "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": 27, "metadata": { "collapsed": false }, "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": 28, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "503.43001170479693" ] }, "execution_count": 28, "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": 29, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "48.499617969617248" ] }, "execution_count": 29, "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": 30, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\n8803s2DBAkJDQ5k2bdrfYpg1axZ+fn5069aNE088kauuuoprrrmmUfE3lJaWxuzZs1m/fj2RkZEE\nBAQQGBjIBx988M9vSgtZtmzZXrnucDV5SV9jzLHAb3UdDjDGjBSRlU1+Yava/0sRGXiA/QOBhcBZ\nIrLjIOeRxl6Do8bBznt2kvNxDkd9dBRBxwZZ1fy7djFnzx7e7duXU4KDm3opzae6Gh57DF5+GZ54\nAv7zH036zWRx0mKmfjuV/hH9ee7M54jvGO/skJRqFF3St/VrE0v67tMez6Ek/jqmbvv7DmNisRL/\nuIMl/qaoyqxi62Vbcfd3tybtCfUku7qaK7ZuRYC1zl6Jb8MGa+W9zp1h3Tqdoa+ZZJRkMO3baazP\nWs+ss2dxTs9z/vlJSinVxjllel9jzPvAKqCXMSbNGHONMeY6Y8x/6w65DwgBXjHGrDPG/H44r1e4\ntJA1w9YQclYIA74egGeoJ8vqevOPDArie2dW89fUwEMPwWmnWTP1ff21Jv5mUOuo5dlfnuXo146m\nX3g/Nt2wSRO/UkrVaXK1v6s5WLW/OITUR1PZ/cpu+r7bl+BTgnGI8HhaGi9mZjKvTx/OcGanvs2b\nrdJ+RATMmQMxMc6LpQ35NeNXrv/qesI7hPPyOS/TK7SXs0NS6pBptX/r1yaq/VuLmoIato3bRm1x\nLUNXD8W7szf5NTWM27aNktpaVg8dSrSzSvt2OzzzjLUIz2OPWYvyaNv+YSu2FXP30rv5bPtnPHPG\nM1zW/zLtzKeUUvvRpGp/Y7nKGHN/3f1YY8wxLRPaoStZXcKaoWvw6+PH0T8djXdnb34rKWHI6tX0\n69CBn44+2nmJPykJRo2Cb7+FP/6whvFpgjosIsInWz+h3yv9sDvsbLlxC5cPuFwTv1JKHUCTqv2N\nMa8CDuAUEelrjAkGvhOR4S0VYCNiqq/2FxH2zN7Dznt30vPVnkT8OwIR4aXMTB5OTWV2r15cGB7u\nnEBF4JVX4IEH4P77YcoUcNMVlQ9XWnEak7+ZTEphCrPHzGZk7Ehnh6RUs9Jq/9avLVT7jxCRIcaY\ndQAiUmiMcYnZD+wVdhJvTKR0dSmDVw7Gr5cfpbW1XJuQQFJlJb8MGUJ3X1/nBJeRARMmQEkJrFoF\nvbQN+nDZHXZe/uNlHl7+MDePuJmFYxfi5e4Sf4pKKeXympr8a4wx7sCfY/zDsWoCnKpyRyWbL95M\n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\nSclejxUX/3979x4eVXXvf/z9DQQhkoBJCElQgogUjEcQUNEKBmgx3kVPUSuIgcYraPyJBxDPc9CW\np6YzYiAAAB5iSURBVLQ9FIuWgyIgai2WqkcqVqNo6g0F9HAxilzUAAEkEEISokAy6/fHTIZJyBWS\nTCb5vJ5nHmbv2bNnzTLtZ9Zea691kMgQGkTessL/44/hppvg9tthxgxoo2ll60utfRE5EZXDOTY2\nloiICLKzs0lISKjTe2bPns2WLVtYs2YNXbp0Yf369QwYMMAf/jX9AIiNjSU8PJycnBz69OkDQE5O\nDt26dav3d/nXv/5FTk4O3bt39/9AKCsr48svv2Tt2rUkJyezZMkS//GHDh1i27ZtJCcn1/uzgqVl\nNOecgyefhFGjYP58+PWvFfz1FNi3f3u/23l77NsKfhGps65du7Jz506OHj0KeIM9PT2djIwM8vLy\nAMjNzSUzM7PacxQVFdGhQweioqLIz89nxowZx31G+eC+ysLCwhg9ejTTp0+nuLiYnJwc5syZw9ix\nY+v9Xe688062bdvGunXrWL9+PXfddRdXX321v+yjRo0iOzubV199lcOHD/Poo4/Sv39/evcOnWlv\nWkb4jxkDzzwDq1bBVVcFuzQhp3wkf+Y3may9Yy13X3C3LvOLSK0CW+LDhw8nOTmZ+Ph4/2X0WbNm\n0atXLwYPHkznzp0ZOXJkjSPiMzIyKCkpITY2lksuuYQrr7yywuv3338/y5YtIyYmhoyMjOPKMHfu\nXCIiIujZsydDhw5lzJgx/v7+2sofqH379sTFxfkfHTt2pH379v67GGJjY3n55Zd5+OGHiY6OZu3a\ntSxdurSW2mperPIoxlBjZs6NGwfz5kFERLCLE1LUty/S/JnZcaPNJbQ0xn9D3zlPeLRnywh/j0eT\n9tRTYN/+wmsX6hK/SDOl8A99zTH8W0YzT8FfZ4Gz9KlvX0SkdQraaH8zSwUex/sDZKFz7neVXo8B\nXgASgDbAbOfcs01dzpZk075N3P6/txMRHsGa9DWarEdEpJUKSsvfzMKAJ4HLgWTgFjPrU+mwicA6\n51x/YBgw28xa1q2JTSRwBT7NyS8iIsEK0wuBLc65HAAzWwpcB2wKOGYP8G++55HAfudcaZOWsgXY\ntG8Taa+l0b5te7X2RUQECF6ffzdgR8D2Tt++QAuAZDPbBawH7m+isrUIZZ4y/vvj/+bSRZcy5t/G\n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\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": 31, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAf8AAAFRCAYAAAB656QgAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xd4FNX6wPHvIQkkgdBSASGhCUhHQcWLUi6oFLuogCIg\nooLKTxCsF1FU8KrYuAp4UYqgF1ERGwgYQEBEhRCQXhIIJIQ00uv7+2M2YRPSC5vyfp5nnuzOzJ55\nZ3ez75wzZ84YEUEppZRSNUctRweglFJKqUtLk79SSilVw2jyV0oppWoYTf5KKaVUDaPJXymllKph\nNPkrpZRSNYwmf3VJGGP8jTFZxphy/84ZY/YaY64v73JLsP3mxpjzxhhTWbdve+9bXcq4yqoyxGyM\nOW6M6e/IGOwZY34wxtxfQWU/a4xZUBFlq8pHk78qFmPMj8aYl/KZf6sx5kwxk3qFDCohIp1EZLMt\nnhnGmCUVsZ1seROCiJwUkfrioEEz8m7fGPOLMWZs3tUcEFpZVeqYjTGfGGNevpTbFJHBIrK0rOUY\nY24wxpzMU/brIvJwWctWVYMmf1Vci4FR+cwfBSwVkaxLHE+FMMY4OTqGCuKQVokyqooxF5uDv2uG\nSn5wpSqYiOikU5ET4ArEAP+wm9cQSAY62Z4PBv4C4oAQYIbduv5AJlDL9vw40N9u+Qysg4js59cA\nW23b3AXcUEhsx4H+wI1Aqm2KB3bZltcHPgZOAyeBVwBjWzYa+BV4GzgHvAy0AjbYnp8FlgH1besv\nse1HInAemGrbtyy7fWsCrAaigEPAQ3n28wusg6nzQDDQo4D9egl4z/bYGUgA5th9Hsm2zyBn+8As\nIANIspWf/fosYIItnmjgg0Lez57ATtvneAZ40+4zzALGA2G2aUqe122zfWZhwPuAs93yYsdgt/7j\nwFHb5/CG3bICPyPb8unAKdt7sB/oZ5tvgGeAI0Ak8DnQ0O519wMnbMueI8/31G698UAakGLbxmq7\nz/5LW0xHgcfzfPYrgaVALDDWNu9/tnnngSCgrS3GCFssA+3K+AUYa/fd3QL82/Z+HgVuslv3QeBv\nW7lHgIdt891t348MrP+T84AfF/8P3gLstZW9EWif539uii3eGGAFUNvRv1M6FX9yeADlshPwX9s/\nyp5irDva9o/5l20a6+j4q8oELAAW2D2fAPxl9/x6oKPtcSesxHGL7Xlxkv8S2+Nmth/1G23PB9ie\nexYQV05Z9uXYLf8a+A9WwvQCfgPG230f0oHHsJJnHaC1bZvOgCcQCLydZ3v97J7n3bfNWInPBehq\n+771tYsvCetAxQCvAdsL2K9+QJDt8bW2H/Dttuf9uXBwk3f7OQnCrqws4FvAA2hui2lQAdvdBoy0\nPXYHetltJwv4zPZedrKVk/3e9wB62farBbAPeKI0MditvwFoAFwGHORC4ivwMwIuB0IBX9vzFkBL\n2+MnbfvXxPb5fAgsty27AisZXmdb9hZWgr8o+dvW/wR42e65Af4AngecgADbZzbQ7rNPBYbZntex\n+z78E+v7txgr4T9rK+Mh4JjdNvIm/1SsgwgDPAKE2a17MxBge9wH64C1m+35DUBonv2x/x+8HOtg\ns78tjqeBw9gO5rD+B34DfLEOQP/GdnChU9WYqkuz/ydYP6bF9bmI9LBNiyoqqGpoMXC3Maa27fn9\ntnkAiMhmEdlne7wXq1Z1Qym2MxL4XkTW2sragPWjOrikBRljfLB+BP9PRFJE5BzwDnCf3WphIvIf\nEckSkVQROSoiG0QkQ0SigLn57Ee+TdLGmOZYiXq6iKSLSBBWq8MDdqv9KiJrRUSwanxdCgh/O9DW\nGNMI68Dqv0AzY4y77fmm4r8TALwuIvEichIriXQrYL00oI0xxlNEkkTk9zzLX7K9l3ux/vfuAxCR\nv0Tkd7GEYh0s5n3fihtDttkiEicip7D73Ir4jDKB2kAnY4yziISKyHHbsgnA8yJyRkTSsVp67rL1\nWbkTWCMiW23LXqRkTeM9AS8ReVVEMkXkBNZnf6/dOttFZI1tH1Jt87aIyHqxTp2tBBrb9jsT638o\nwBhTv4BthojIItt3aTHgZ/vOIyI/2mJARLYA67AOAopjOPCdiGy0xfEm4Ab0tlvnXRGJEJFYYA1F\nf5aqEqkWyV9EfsVqesphjGll66S20xizyRhzuf3iSxth9SAiW7GaQ2+z9cLuCSzPXm6M6WWM2WiM\nOWuMicX6ofUqxab8geHGmGjbFINVG2tSyrJcgDN2ZX2UJ65cHZ+MMT7GmBXGmFO2/VhWgv1oAkSL\nSJLdvBCs1oxs4XaPkwDX/DpMikgK1kFPX6xkH4hVa/0HVqIrafKPyLPdegWsNw5oBxwwxuwwxgyx\nDwurOT1bCNAUwBjT1hizxtYBNBZ4lYvft3xjsF2xEW+7auE6u3UK2laBn5GIHAUmY502iTDGLDfG\n+NnK8Ae+zv5uYdVY07FqsE2x+y7YPsOoAt6j/PhjHZzZf2+fBXzs1jmZz+vs35Nk4JwtmWc/h4I/\nq5zvkogkY/22Zb+nNxtjthtjomyx3Ezxv8dNsd7v7LLFFrv997i43ydVCVWL5F+ABcAkEemJ1WT1\nod2yO4wxQcaY/xljLnNMeFXWUqzmxlHAWhGJtFu2HPgGaCYiDYH5FHyglYjVpJzNz+7xSazmx8a2\nqZGIeIjIG8WIL29N7STWeVlPu7IaikiXQl7zGlaTc0fbfozKsx+F1QZPA42NMXXt5rXAOgdeGpux\nml67YZ2H34zVytXT9jg/JamtXvxiq1Y9QkS8gTeAL40xbrbFBqvJPlsLrH0G639sP9Da9r49TzEP\ntMW6YsNDrKsWttotst+Wv922XqeQz0hEPheRPrbXAMyx/Q0Fbs7z3aorImewTlPlbM/WwuJZWNh5\nnp/EaqK3L7uBiAwr5DUVwtY69yXW5+ctIo2AH7nwHhUVx2kuvHfZmpP7YExVYdUy+dt+eHsDK40x\nu7CSkK9t8bdY58G6Auuxa7ZWxbIE6/zkQ1z83tUDYkQk3RjTCxiRZ7l9ItgN3GuMcTbGXAXcZbds\nGTDMGDPIGFPLGONquzSpaTHii8BqJjUAIhKO1dw51xjjYSytihgXwAPrfGe8MaYZ1sGjvXCsDmcX\n7ZuteXob8Loxpo4xpgtWTbqwy7MKS5CbsE4Z/C0iGVi1/4eA47bm7vzKiMgnvmIzxow0xmTXEOOw\nEoX91RwvGmPcjDEdgTFYTdNgvW/nRSTJGNMeeLS0Mdh52hjT0HY65Qm7bdWjgM/IGHO5MaafLQGm\nYdWes+OfD7xmjGlhW9fbGHOLbdmXwFBjTG9jjAvWKYHCPpu87/Pvtnim2b6zTsaYjrbv96VW2zad\nE5EsY8zNwCC75RGAZyGnE/4HDLG9j87GmKlYB9HbKzRqdclUy+SPtV8xtnP63W1TJwARibGdzwPr\nfNyVDouyChKREKzk5o51IGXvMeAVY0wc8AJWr/ZcL7d7/CLQBqsn8QysTmTZ2zgF3IrV2zoSq/lx\nKgV/X+3LXYn1gx1ljPnDNm801g/h37btrSR3S0NeM7G+F9nnMlflWT4bKwFGG2OeyieG+4CWWLWn\nVcCLIvJLIdsrrBa2Datz3SYAEfkbK5nlbfK3L+NdrL4ZUcaYdwrYRmHbvAnYZ4w5j3Uu/R6789PY\ntn0E+BmrB/4G2/ypwEjb6+ZzIVEXtM2iap+CddXEn1idc9cA2X10CvuM6mB9RpFYn4E3VvM7WO/N\namCd7Xu6DauTYvZ7OxGr5/pprCb/wmq6/wU62r4HX9nO2Q/FaqU5jtWhcSHW1SZlIQU8LnBdEUnA\nOlhaaTu9cS/WfmNbfhBrP4/Z4s/1/yAih7BaUz7Aeh+HYHVUzChmHKqSy77c6dJu1GpqX4JVG88C\nForIewWsm3350D0i8lUhZQZgddbpbHv+K/COiHxpe95FRPYYY/xstUGMMbcDT4tI7wKKVUrZGGP8\ngWOAi1STcR2UqqmcHbTdDOApEdltjKkH/GmMWSciB+xXsnWCmg2sLawwY8xyrE5RnsaYUKya5Ejg\nI2PMC1j7+TmwB3jC1syXjlULfLA8d0ypak47yypVDTik5n9REMZ8A7xv13yYPf9JrHN2PbEuOymw\n5q+Uqlha81eq+nD4OX9bc303YEee+U2B20TkQ7S2oZTDiUiIiDhp4leq6nNo8rc1+X8JPGnroGLv\nHawhOnNWv2SBKaWUUtWYw5r9jTHOwHfAjyLybj7Lj2U/xBqYIhFr+Mhv86zn+PMWSiml1CUmIqWu\nFDuy5r8I69rlixI/gIi0sk0tsVoHHsub+O3W1akCpxkzZjg8hpow6fus73F1mPQ9vjRTWTmkt79t\n+M6RQLBtEB7BuqbbH2skyQV5XqK1e6WUUqqcOCT5izV8Z7HvZS0iYyswHKWUUqpGcXhvf1X59e3b\n19Eh1Aj6Plc8fY8rnr7HVUOluM6/LIwxUtX3QSmllCoJYwxSRTv8KaWUUsoBNPkrpZRSNYwmf6WU\nUqqG0eSvlFJK1TCa/JVSSqkaRpO/UkopVcNo8ldKKaVqGE3+SimlVA2jyV8ppZSqYTT5K6WUUjWM\nJn+llFKqhtHkr5RSStUwmvyVUkqpGkaTv1JKKVXDaPJXSimlahhN/koppVQNo8lfKaWUqmGcHR2A\nUkpVNknpSWw4toHvD3/P1pNbycjKcHRIqga75fJbmDNwTrmWaUSkXAu81IwxUtX3QSlVOaw+sJr5\nf85nS+gWrmp6FUPaDqFfQD/cXdwdHZqqwerXqU+z+s1yzTPGICKmtGVq8ldK1XgxyTE8/uPj7Ajb\nwax+s7ipzU00cG3g6LCUKlBZk7+e81dK1Wjrjq6jy0ddaOjakN0TdnNPp3s08atqT8/5K6VqpMS0\nRKb9PI01h9aw6JZFDGw90NEhKXXJaM1fKVXj/B72Oz0W9CAuNY49j+7RxK9qHK35K6VqjIysDF7d\n/Crzds7jg8EfMLzjcEeHpJRDaPJXStUIh6MOM+rrUTSo04BdE3Zd1HtaqZpEm/2VUtWaiLDwz4Vc\n+99rGdl5JD+N+kkTv6rxtOavlKq2IhMjGb9mPCFxIWx6cBMdfTo6OiSlKgWt+SulqqWfjvxEt/nd\naOfZjt/G/aaJXyk7WvNXSlUryenJTF8/nW8OfMOy25fRr2U/R4ekVKXjkJq/MeYyY8xGY8w+Y0yw\nMeaJfNYZYYwJsk2/GmM6OyJWpVTVsSdiDz0X9uRs4lmCHgnSxK9UARwyvK8xxg/wE5Hdxph6wJ/A\nrSJywG6da4D9IhJnjLkJeElErsmnLB3eV6kaLkuyePe3d3nt19d4e9DbjOoyCmNKPfKpUpVeWYf3\ndUizv4iEA+G2xwnGmP1AM+CA3Tq/2b3kN9typZTK5XT8aR785kES0hLY8dAOWjVq5eiQlKr0HN7h\nzxgTAHQDdhSy2kPAj5ciHqVU1bH6wGp6zO/Bdc2vY/OYzZr4lSomh3b4szX5fwk8KSIJBazTDxgD\n/ONSxqaUqryS0pN4au1TrDu6jq/u+YrezXs7OiSlqhSHJX9jjDNW4l8qIqsLWKcLsAC4SURiCirr\npZdeynnct29f+vbtW66xKqUqj11ndjHiqxH0bNqT3Y/spn6d+o4OSakKFxgYSGBgYLmV55AOfwDG\nmCXAORF5qoDlLYANwP15zv/nXU87/ClVA2RJFm9vf5s3tr7Buze9y32d73N0SEo5TFk7/Dmqt/91\nwGYgGBDb9BzgD4iILDDGLATuAEIAA6SLSK98ytLkr1Q1dzr+NKO/GU1yejLL7lhGQMMAR4eklENV\nyeRfnjT5K1W9rT6wmgnfTeCxno/xXJ/ncK6lY5MpVSUv9VNKqaIkpScxZe0U1h5dq536lCpnDr/U\nTyml8todvpurFlxFfFo8uybs0sSvVDnTmr9SqtKwH6lv7o1zGdVllKNDUqpa0uSvlKoUwhPCGf3N\naM6nnteR+pSqYNrsr5RyuO8PfU/3+d25utnVbBmzRRO/UhVMa/5KKYdJTk9m2s/T+PbQt/zvrv/R\nx7+Po0NSqkbQ5K+UcojgiGBGfDWCK7yvIOiRIBq6NnR0SErVGNrsr5S6pESE93e8T/8l/Zly7RQ+\nv/NzTfxKXWI6yI9S6mKHDkFkJMTHX5jS08tc7PnUeBYHLSYhNZ5xPcbhU9enHIJVqppr2xb69881\nSwf5UUqVn1274JlnIDgYAgLAw+PCVLt2mYo+GXeSwJBN9PK8nKuaDsTp4CngVLmErVS15uJS7kVq\n8ldKwbFj8OKLsHGj9XfNmjIn+2wpGSk8s/4Zvtq/lyWzv+fqgL7lUq5SqvT0nL9SNVlyMkyfDr16\nQbt2cPgwPPZYuSX+fWf3cfXHV3Pq/Cl2P7Kbvpr4laoUtOavVE21ZQuMGwc9esC+feDrW25Fiwgf\n/vEhMwJnMHvAbMZ2H4sxpT49qZQqZ5r8lappEhLg2Wfhq69g3jy47bZyLT4yMZJx344jLD6MX8f8\nSjuvduVavlKq7DT5K1WT/PYbjBgBN9wAe/dCo0blWvzPR3/mwdUPMqrjKD675jMyD2RyLuYcGTEZ\n1hSbgWTo1TlKlUTdrnXxuat8r4zR5K9UTZCVBW+9BW++CfPnl1ttPzM5k6S/k4jdHcvPP/xM3P44\nlqUtwynMieBGwbj6u+Ls6YxLIxecGzrj3NAZU1ub/5UqCeNc/v8zmvyVqu7OnYPRoyE6Gn7/Hfz9\ncy1OycwkLC2NM6mpnE5L43RqKmfT00nKzCRVhNSsLFKysiAti8aHM/Ddk4FPUDo+ezPwOJ1JdHPD\n/mZRnGnlQd0JnTjkX4f4y5zIcLP/wcoC0myTUqok+jR0YWI5l6mD/ChVnW3dCvfeS9KoURyYNo39\naWnsT0zkeEoKJ1JSOJ6SQlR6Ok3r1KFp7do0qV2bpnXq4OPiQr3MWjTYk0aDbcnU3ZqES1AKmc1r\nk36lK+lXupHW3Y31zttYcehzhl9xDwNaDUDr9EqVP39XV65t0CDXvLIO8qPJX6lqJjItjT/j4/lj\n40b+OHGCoCuvJNzZmbZubnRwd6e9uzut3dxo6epKgKsrTevUwcnWEz/5aDJR30cR9UMU57edx62t\nG436N6Jh/4Y06N0A5wZWY2F0cjTj14znaPRRVty5gg7eHRy5y0rVOJr8NfmrGu5kSgq/xMbyS2ws\ngbGxxKan0yMsjKv27OGqe++la5s2tHJ1xbnWxcN6SJYQty2OqNVRRH0XRXpMOp5DPPEc7EnDfg1x\naXzxyGK/HP+FB755gLuvuJvXB7xOHec6l2I3laqWRKwLcCIiCp569bIG3rSnyV+Tv6phMkXYGhfH\nqshIfoiOJjYjg74NG9K/YUP6ZmTQbuRIanl7w5Il1rC8eUiWELc1jsiVkUSuisTF0wWv273wHOaJ\nRw8PTK38f0/SMtP41y//YumepSy6ZRE3trmxondVqSpJBGJiLk7iZ8/mP69WLfDxsYbayG9q3x46\ndcq9DU3+mvxVDZApwoaYGL6MjGT1uXM0q1OHO7y8GOblRee6dalljDUu/623WgP3vPii9YtiJ2Fv\nAhGLI4hYHoGLpwvew73xudsH93buRW7/cNRhRnw1At+6viy6dZHekEfVOJmZVt/ZgpK4fTI/exbc\n3S9O4vkleB8fqFev5PFo8tfkr6qxUykpLAoP579nzuDt4sJ9vr7c4eVFSze33CuuWQNjx8KHH8Jd\nd+XMTotMI+KzCCKWRJB2Ng2/+/3wvd+XulfULdb2RYRPdn/C9PXTmXHDDCb2nKgj9alqIy3Nunll\nYYk8+3F0NDRsWHgiz568vcHVtWJj1+SvyV9VM2Kr5b9z6hTbzp/nXh8fxjdpQvd8mvARgXffhX//\nG77+Gnr1QkSI2xzH6fmnifohCq9hXviO9qVRv0YYp+L/VsQkxzDhuwnsP7efFXeuoJNPp6JfpJSD\nJScXr7k9IsK6U7W3d8GJ3H6+tzc4V6KL4zX5a/JX1USWCKvPneO10FASMzOZ2rw59/j4UNfJKf8X\nZGTAk0/Cpk3w/fdkNGpG+CfhnP7oNBhoOqEpvg/44tKo5LcD3Ryymfu/vp/b2t3GnIFzcHWu4GqM\nUgUQsZJ0UYk8e1lqatGJPHtq3Piis2NVhiZ/Tf6qissSYcXZs7waEkJdJyeea9GCW728rPP4BUlI\ngHvugYwMkucs5dSncUQsiaDRoEY0m9iMBv9oUKrm+fTMdF7e9DIf7/qYj4d9zJDLh5Rhz5TKn4jV\njF5QIs8738mp6ESePb9BA6gJZ6bKmvwrUSOGUjVPYEwMU44excUY3mvThgGNGhWdtCMiYOhQYn0G\ncLLOCM4PPEyTh5pwVdBVuDYvfQ39aPRRRn41kkZujdg1YRd+9fxKXZaqeew7xBXV5B4ZCXXr5p/I\ne/W6eH7d4nVRUSWgNX+lHOBAYiLTjh0jODGR2a1aMdzbu1g1dTl4kOi+zxDi8iBpLr40n9ocvwf8\ncKpbwKmBYhARlu1ZxlPrnuL5Ps/zxNVPUMtU0bZQVa7S0wtvZrefYmJyd4grqod7HR0eoky02V+T\nv6pCkjIzmXniBIvCw5nevDmTmjXDtaBz+nYkUzj76lZCXzkKfn60+Hc3vO/yppZz2ZJ0XEocj37/\nKLvDd7PizhV09etapvJU5ZecXPR58+zH58+Dl1fupO3nl3+Tu5dX5eoQV91ps79SVcSGmBgmHDxI\nz/r12duzJ761axf5GskSIldGcuLpvTifOUKr51vQeMagcrncbmvoVkZ9PYqbWt/EHw//gbtL0df7\nq8qnsBHi8kvy2R3i8tbIW7WCa6/NvczTs+p2iFOF05q/UhUsOj2dqUePsj4mhv+0bctQL68iXyNZ\nQuSqSE7MPIFTcgwto9+i0Y8vY665pszxZGRlMGvzLD764yPmD53Pre1vLXOZqnzlN0JcYZ3jjCn4\nmvO8Sb6mdIir7qpkzd8YcxmwBPDFutfnQhF5L5/13gNuBhKBB0Vk9yUNVKkyWh8dzYMHDnC7tzf7\nevbEo4h2UREh5ucYjj1zDONkaN3zLxpvnI3Z/pM1xmcZnYg9waivRuHq7MpfE/6iqUfTMpepiqc4\nI8Rlzy9shLirriqfEeJUzeaoZv8M4CkR2W2MqQf8aYxZJyIHslcwxtwMtBaRtsaYq4GPgLJXe5S6\nBFKzsnj+2DE+P3uWT9u355+NGxf5mvN/nOfYM8dIPZlKy1cC8N4+B7P+Z9i2FZo1K3NMy4OX8+RP\nTzKt9zSm9J6infrKQWEd4vLOtx8hLm9tvF273PN9fCp+hDhVszkk+YtIOBBue5xgjNkPNAMO2K12\nK1brACKywxjTwBjjKyIRlzxgpUrgQGIiI/bvp0WdOuy+6iq8iji3n3wimWPPHCNuSxwBMwLwG+VJ\nrQkPwfHjsHkzNGpUpnjOp55n0g+T2BG2g7Wj1tKjSY8ylVfdlXSEOPsOcdlT06bQvXvlHiFO1WwO\n/yoaYwKAbsCOPIuaASftnofZ5mnyV5XWsvBw/u/oUWa1bMnDTZoU2jEvIz6D0NdDOT3/NJc9eRnt\n/9seJ5MKw++0Vli3zmr7LYMdp3Yw4qsRDGg5gL8e/ou6tWveBdP2I8QVp5d73hHishO4fYe46jBC\nnKrZHJr8bU3+XwJPikiCI2NRqizSsrKYcvQoP0VHs7FrVzoXchJWMoXwT8M5/uJxGg1qRM89PanT\nrA7ExsKwYeDvD598Ai4lH5Y3W2ZWJq//+jrv//4+Hw75kDs63FHqsiqjgm6ZWtQIcXmb2zt1ggED\nauYIcapmc1jyN8Y4YyX+pSKyOp9VwoDmds8vs827yEsvvZTzuG/fvvTt27fc4lSqKKdTU7l73z48\nXVzY2aMHDQtJ2ud/P8+hxw5Ry7UWnb7tRP2r6lsLwsPhppvg+uvhnXfKVJ0MjQtl1FejcK7lzJ8P\n/8ll9S8rdVmXUn4jxBVUU88eIS6/AWR69bp4vo4Qp6q6wMBAAgMDy608h13qZ4xZApwTkacKWD4Y\nmCgiQ4wx1wDviMhFHf70Uj/lSL/GxnLP33/zaNOmPOfvX+B4/Gnn0jj+7HGivo+i1ZxW+I7yvXBK\nICQE/vlPGDkSZswoU7Vz5b6VTPxhIlOuncLU3lNxqlX6kf/KQ1pa7h7shdXU894yVUeIU6pgVXKE\nP2PMdcBmIBgQ2/Qc4A+IiCywrfcBcBPWpX5jROSvfMrS5K8cYkl4OFOPHmVx+/bc7OmZ7zqSJZxZ\neIbj/zqOz30+tJzZEucGdg1u+/fDjTfC1KnwxBOljiUhLYEnfnyCLaFbWH7Hcno261nqsoqSX4e4\ngmrq2bdMLSqRa4c4pUqmSib/8qTJX11qWSL86/hxlp89y3edO3NFAW3KCXsTODThEAhc/tHl1OuS\npx/AX3/BkCEwZw488ECp49kZtpMRX43g+hbX8+7N71Kvdsku+i5ohLiCauoF3TI1vwSvHeKUqhia\n/DX5q0soOTOTBw8c4GRqKt906oRPPpfxZSZnEvJKCGcWnqHlrJY0Gd8EUyvP/+iWLXDnnTB/Ptx+\ne6liyZIs/r3137y1/S3mDZ7H3R3vzlmWt0NcUdeiFzRCXH41de0Qp5TjafLX5K8ukci0NIYFB9PK\nzY1F7drle0OemF9iODj+IB5XetDmnTbUaZLPiekff4TRo2H5cutcfzFlZkJUlJWs94aeYta+B0hJ\ny2BQwjKSw1vkSvD2I8QVdO9z7RCnVNWlyV+Tv7oEjicnc+OePdzt7c2sli0vun4/43wGx6YfI+q7\nKNp+2BavoQWM379yJUyaBKtXwzXXFDhCXH7zsjvEuXb/ioiej9I+7gn6Oj9DE1+ni2rqOkKcUtWb\nJn9N/qqCBSUkMGTPHp5p0YJJl1182Vz02mgOPnyQxoMa0/rN1qTXds43iQf88gk3b32epzv+yLbE\nroWOEJdfbd29QSLTNjzF+uPr+eyOz7jmMh3tWqmaSpO/Jn9VgQJjYhj+99+8cVlb/pHuk6smfi40\ng2bfHMErNIZVLduxLbVxgSPE3X7yPW744002v/Az7t3blbhD3K4zuxjx1Qh6Nu3JB4M/oH6d+hW/\n80qpSksIgJlpAAAgAElEQVSTvyZ/VQqFjRCXXVvf7xXJsdsO4fTaFdTe2yhXjbxzZgy9txwguWNj\n5JHW+AQ45yzL1SFOBF57DT79FNavt0bvK4EsyWLu9rnM2TqHd256hxGdR5T7e6GUqnqq5C19laoI\neUeIK2xQmcjI/G+Z6usLPXvC383C2Vb3GF/7dWHABo+cDnGZyZkcf+44Z/93lnbL2+E5OP/r+wEr\n8T/7LHz3nXWDniZNSrQ/Z+LPMPqb0SSmJ7LjoR20bNSyDO+OUkpdoMlfVWrZI8QV57ap+Y0Ql10b\nz75lanFGiPsoLIxVoaFs6dKVDnbd4ON3xbN/5H7qdq5Lzz09cfEsZOz9rCxr0J7ffoPAQOvEfgms\nObiG8WvG88hVj/DC9S/gXEv/VZVS5Ueb/dUlV9oR4gq6ZK08R4h76+RJ5oWFsb5rV1q5uQHWKH0n\n3z7JyTknafNOG3xH+hZeSEYGjB8PR45Ytf4GDYq9/eT0ZKaum8oPR35g6e1L+UeLf5Rld5RS1ZQ2\n+yuHs79lanGa3NPS8k/ibdpA796OuWWqiPBySAjLIyLY1K0bzW3XyaWGpbJ/9H6yUrLosbMHbgFu\nhReUlgajRll36PvppxJdQL8nYg/3rbqPLr5d2DVhFw1dG5Zll5RSqkBa81f5KuqWqXmTfPYtUwu7\nVC17ql+/co0QJyK8ePw4q6OiWN+1K762UfvOrT7HwQkHaTaxGS2ebUEt5yKOQpKT4e67reaHL74o\n9p1nRIT3drzHrC2zeGvQW9zf5f6LxhFQSil7WvNXxWY/QlxRze15R4jz88t9y9S8Sb6qjhAnIjx/\n/DjfR0WxsWtXvGvXJis1i6NPHyVqTRSdvu5Eg2uL0WyfkAC33GK9UYsXQyG39bUXkRDBg6sfJDo5\nmt/G/Ubrxq3LuEdKKVU0Tf5VXH4jxBXU5B4dbZ1+zq823q5d7tp6TRghTkR49tgxfoqOZkPXrnjV\nrk3S4ST+vvdvXANcufKvK3FpVIwkHhsLgwfDFVdYY/XnM+xvfn44/APjvh3HuO7jmHHDDFycinfA\noJRSZaXN/pWQfYe4onq5nz9f/BHi9JapF4gI048d4+eYGNZ37YqniwsRKyI48sQRAmYG0PTRpsVr\neo+MtG7J26cPzJ1brA4KKRkpTPt5GqsPrmbp7Uu53v/6su+QUqpG0Wb/KqCgW6YWlODtR4izT+Kt\nWsG11+ae7+mpt0wtqezEvz4mhg1du9IgsxYHHz9I7IZYuvzcBY9uHsUr6PRpGDgQbr0VXn21WB0Z\n9p7dy32r7qODVwd2T9hNI7dGZdwbpZQqOU3+pVRQh7iCaupOTvnXxjt1uni+3jK1Yr14/DjroqPZ\n2K0bbqcy2HX3PquZ/48rcW5QzH+JkBAYMADGjoXnnitydRFh3s55zNw0kzf++QYPdntQO/UppRxG\nk78d+xHiCrtULXvQmbwjxGUn8auu0lumVlavnDjBN+fO8Uu3bmT9FMdfDx2kxbMtuOzJy4qfjA8f\ntm7F+9RT8OSTRa5+NvEs474dR3hCONvGbqOtZ9sy7oVSSpVNtU/+pR0hLm9tPO8Icd7e1b9DXHUz\nJzSUzyIi+KVzV+JnniJiSYTVm7938QfhYe9e6xz/zJnw0ENFrr72yFrGrB7DA10fYNXwVdR2ql2G\nPVBKqfJRLTr8LVwoBdbSC7plan7n1LVDXPX1zsmTfBAWxkb/TsSMOYqkCld8cQW1fUqQjP/8E4YM\ngbffhhGF32AnNSOVZzc8y8q/V7LktiX0a9mvjHuglFIXaIc/YNu2izvEXeoR4lTlNf/0ad4NC2Nd\nrbacvm4vXnd40Wp2q6IH7bG3bRvcdhssWGD9LcT+yP3ct+o+WjVqxe4Ju/F0L+TmP0op5QDVouZf\n1fdBVZxl4eE8c+wYPxxsTvy0UNq83wbfe4sYmz+vjRvh3nth6VKryb8AIsKCPxfwwi8v8Gr/Vxnf\nY7x26lNKVQit+StVgK8jI5l2+CjfrPIkaU0YXTd0pV6XeiUr5PvvYcwYWLkSbrihwNXOJZ3joW8f\nIjQulC1jttDeq30Zo1dKqYqjDeKqWloXHc3//XmQL152o/beFK78/cqSJ/5Vq6xL+b79ttDEv+HY\nBrrP706bxm3YPm67Jn6lVKWnNX9V7fwaG8vTP/3NpzOc8BvsQeu3Wpfs/D5YTfzTpsHatdCtW76r\npGWm8eLGF1kWvIxPb/2Uga0HlkP0SilV8Yqd/I0x7sAooBNWi4ErkAUkAL8BX4pIVkUEqVRx7YqP\nZ+Z/g3lnNrSbE0CTsU1KXsiCBfDyy7BhgzVefz4ORR1ixKoRNPVoyu4Ju/Gu613GyJVS6tIpVoc/\nY8xAoAPwvYgczWd5V2Ag8LOIBJV7lIXHph3+FAAHExOZ/cJfjFphuGpVZxpcV4Lr97O98441rV8P\nbdpctFhEWLRrEc9seIaX+77MI1c9op36lFKXXFk7/BWZ/I0xrsBlInKkGMF0FpHg0gZTGpr8FcDJ\n+CQWjv6Df/ztTJ+fuuMW4FbyQl57DT75xKrxt2hx0eKY5Bge/u5hDkUdYvkdy+no07EcIldKqZIr\na/Iv8kSoiKQUlvhtpwOy172kiV8pgIiIJL4f8AdXxtSh/++9Sp74ReD55+Gzz2Dz5nwT/6YTm+j6\nUVeaeTRjx0M7NPErpaq08ujw9zDwTjmUo1SJnTuUQOCNf+HWty7DFnYvecc+Efi//7OSfmCgNcyj\nnfTMdF4KfIlPdn/Cf2/5Lze3vbn8gldKKQcpVvI3xrwNXA+cz7sIaI8mf+UA57bFsv3WIEIf82Dq\nS91Lfu49MxMefRSCg62BfBo2zLX4SPQRRn41Ek83T3ZN2IVvvRIODqSUUpVUcWv+U4DJIjI37wJj\nzOTyDUmpokV8eZY/J+wn8BUP3ni0FIk/IwMefBDCwmDdOvDwyFkkIiwJWsLUn6fy4vUv8nivx7VT\nn1KqWin28L7GmEYiEpPP/LoikliijRrzX2AoECEiXfJZ7gksA5oATsBbIvJpAWVph78aREQ4+dZJ\n9r51gmVz3Vl0d3dcnZxKVkhamnVjnoQE+Oor697MNrEpsTzy3SMEnw1mxZ0r6OJ70ddTKaUcrsI7\n/GXLL/Hb5pco8dt8AhQ8SDpMAnaLSDegH/CWMUYHJKrhJFM48sQR9nx8kjcXuvLRXd1KnviTk+H2\n260m/9WrcyX+X0N/pdtH3fBy9+KP8X9o4ldKVVsOSagi8qsxxr+QVcKBzrbHHkCUiGRUfGSqsspM\nzmT/yP2ciEzkuXlO/NynG/VLev/lhAS45Rbw84PFi8HFBYCMrAxe3vQyC/5cwMJhCxnWblgF7IFS\nSlUelbU2vRDYYIw5DdQD7nFwPMqB0qPSCb4lmLNNDI/NymBTrx741q5dskLi4mDwYOjQAebPB1uL\nwfGY44z8aiT1atdj14RdNPEoxYiASilVxZQ6+Rtj7hSRVeUZjJ1ngSAR6WeMaQ38bIzpIiIJ+a38\n0ksv5Tzu27cvffv2raCw1KWWfCKZPTftIenGeoy+K4a13brS0q2E1/FHRVm34u3d2xq9r5Z1tuuz\nPZ8xee1knv3Hs0y+ZjK1jN7nSilVOQUGBhIYGFhu5RW7w99FLzRmtIgsLvWGrWb/NQV0+PsBeFVE\nttqebwCmi8gf+ayrHf6qqYSgBPYM2YPTk74M6x3OF1dcQb9GjUpWSHg4DBxo1fpnzwZjiEuJY+IP\nE/nzzJ+suHMF3fzyv3GPUkpVVpesw18+yppxjW3Kz37gnwDGGF/gcuBYGbenqpDYzbEEDQqi/pwW\n3HFdBP9p27bkif/kSetWvMOH5yT+7Se3031+d+rVrsefD/+piV8pVSM55Jy/MWY50BfwNMaEAjOA\n2oCIyALgdeATY0wQ1gHCNBGJdkSs6tKL/CaSQw8founSy7mx4TGeu8yfu3x8SlbIsWMwYAA8/jg8\n9RSZWZm8tvk15u2cx0dDP+K29rdVTPBKKVUFOKq3/4gilp8DtMt1DXT649Oc+NcJ2qzpyDDnowxv\n5M3EZs1KVsiBA1ZT/3PPwaOPEhIbwqivR1HbqTZ/PvwnzeqXsDyllKpmKmtvf1XDiAihc0I5s+AM\nnX7pyr2pR+lUuy6vtGxZsoL27IGbboLXX4fRo/l87+c88eMTTO09lam9p2qnPlXlBAQEEBIS4ugw\nVBn4+/tz4sQJR4eRS1k6/LmLSFI5x1OaOLTDXxUnIhybfoyoH6LosrYLj8afICItjdWdOuFSqwTJ\neudOGDoU3n+f+Ftv5vEfH2f7qe0sv2M5Vza9suJ2QKkKZOvY5egwVBlUxGfosA5/lSHxq6pPMoVD\nDx8idlMs3Td155XU0+xLTGRlx44lS/xbtsCQIfDxx/x+XQDd53fHpZYLfz38lyZ+pZTKo8hmf2NM\nHaCeiEQVY93mInKyXCJT1V5Wahb7799PenQ6XTd0ZWFcBCsjI9navTt1SzJs7/r1cN99ZC5byhvu\nu3hnxUPMGzyPu664q+KCV0qpKqzI5C8iqcaYgcYYD+AbEUnOu44xpiEwHPgb0OSvipSZlMneO/bi\n5OZE5+868218NK+EhPBr9+54l2T0vu++g7FjiVjyIfecmQ3AH+P/oHmD5hUUuVJKVX0luaufHzAW\n8AFcsQ4cMoEk4BTwsYjEVVCchcWl5/yrmIzzGQQPC8bV35V2i9rxW2I8t+7dy4+dO3NV/frFL2jl\nSpg0iY3v/h/3nZrLk1c/yfTrpuNUq4Q3+1GqEtNz/lVfZTznX+oOf5WFJv+qJT06nT0378Gjhwdt\n57XlYHISfXfv5tP27bnJ07P4BS1ZQtb0abz8zLUsM8Esv3M5vZr1qrjAlXIQTf6F8/DwIDg4mICA\nAEeHUqDKmPz1uid1yaRFpLG7324a9GlA2/+0JTw9jZuDg5ndqlXJEv/8+aQ9M40h41w54d+AXRN2\naeJXygFatmzJxo0bAVi8eDF9+vSp0O3169ePRYsW5ZoXHx9fIYl/3rx59OzZE1dXV8aOHVvu5Tua\nXuevLonUsFR2D9iNz70+BMwIICEzk8HBwYz18+PBJsW/k17W228T/+YsBj5geOred7i3070VGLVS\nqrhEBGNKXRElMzMTp5J09K1gzZo148UXX2Tt2rUkJ1/U1a3K05q/qnApISnsun4XTcY2oeVLLckQ\n4a59++jl4cEL/v7FLuf8v6Zz+o0XGPt/rfnfM39q4leqkjhw4ACPPvoo27dvx8PDg8aNGwOQlpbG\n1KlT8ff3p0mTJjz22GOkpqYCsGnTJpo3b84bb7xBkyZNGDt2LLGxsQwbNgwfHx88PT0ZNmwYp0+f\nBuCFF15gy5YtTJo0ifr16/PEE08AUKtWLY4ds279cv78eR544AF8fHxo2bIlr776ak6M2S0TTz/9\nNI0bN6Z169b89NNPBe7Tbbfdxi233JKzL9WNJn9VoZKPJbO7726aPd6MFtNaICKMP3iQ2rVqMa9t\n2+LVFEQ4NOEuzix4i//9ZyJfTNlOQMOACo9dKVU87du356OPPuLaa68lPj6e6GjrVizTp0/nyJEj\n7NmzhyNHjhAWFsbLL7+c87rw8HBiY2MJDQ1lwYIFZGVlMXbsWE6ePEloaCju7u5MnDgRgFmzZtGn\nTx8++OADzp8/z3vvvQeQ6zdk0qRJxMfHc+LECQIDA1myZAmffPJJzvLff/+dDh06EBUVxdNPP824\nceMuxdtTKZU4+RtjmhT2XKlsSYeT2N13N82nNaf5ZOvSu3+dOMHfSUl8fsUVOBdjEJ+k1AQ23tqF\ntB/WcH7tGp66498419KzVUplM6Z8poqwcOFC5s6dS4MGDahbty7PPPMMK1asyFnu5OTEzJkzcXFx\noU6dOjRu3Jjbb7+dOnXqULduXZ599lk2b95c6DayO9JlZWXxxRdfMHv2bNzd3fH392fKlCksXbo0\nZ11/f3/Gjh2LMYbRo0cTHh7O2bNnK2bnK7nS/Ir6GWOuE5EvjTFtgOuBRUW9SNUsifsTCRoYRMuZ\nLWkyzjo+XHD6NCsiItjWo0exBvHZHfYnh4f/k65RzvjuPEQDv+KfIlCqpqisFwJERkaSlJTElVde\nGGEzKysrV693b29vXFxccp4nJyczefJk1q5dS2xsLCJCQkJCsfoTnDt3joyMDFq0aJEzz9/fn7Cw\nsJznfn5+OY/d3Nxyyvcp6V1Dq4ES1/xFZBcQaoyZAAwSEU38KpfEfYkEDQii1WutchL/91FRzDhx\ngh+7dMGniEF8siSLd7a8yZGh19EnrQmX7zymiV+pSi5vcvby8sLd3Z19+/YRHR1NdHQ0sbGxxMXF\nFfiat956i8OHD7Nz505iY2Nzav3ZBwyFHQB4eXnh4uKS6yZIISEhNCvpXUFriNKe8z8JtEdH81N5\nJO6zavyt/90avweso+yd58/z4IEDfNOpE23d3Qt9fXhCOMMW30jXya8z2PNq/Db/CR4elyJ0pVQZ\n+Pr6curUKdLT0wErUY8fP57JkycTGRkJQFhYGOvWrSuwjPj4eNzc3Khfvz7R0dG89NJLF20ju3Nf\nXrVq1WL48OE8//zzJCQkEBISwty5c7n//vtLtT+ZmZmkpKSQmZlJRkYGqampZGZmlqqsyqg05/y9\ngftE5P+AVGPMwPIPS1VFCXsTrMT/Zmt8R/oCcCw5mVv37uW/7dpxdRGj931/6Huu/aAbcz88wQ0t\nrsf9+3Xg5nYpQldKlYJ9Tbx///507NgRPz+/nGb02bNn06ZNG6655hoaNmzIoEGDOHToUIHlTZ48\nmaSkJLy8vOjduzeDBw/OtfzJJ59k5cqVeHp6Mnny5ItieO+993B3d6dVq1Zcf/31jBo1ijFjxhQr\n/rxmzZqFu7s7c+bM4bPPPsPd3T3X1QNVXYlH+DPGXAPsyB5Wz3b+f2tFBFfMeHSEv0ogITiBPYP2\n0Prt1vjeZyX+c2lpXLdrF5Mvu4xHC2l6S05PZtrP01gf/A3bV3vTsGUHWLwYnLVjn1I6wl/VVy1G\n+BOR3+yzrSMTv6ocEvbaEv/cC4k/OTOTW/bu5XYvr0ITf3BEML0+7kVCZBjB3zSl4RU9YMkSTfxK\nKVWB9Dp/VSaJ+xIvJP57rcSfKcLI/ftp6erKa61a5fs6EeH9He/Tf0l/nu/wCIveD8W559WwYAFU\nolG+lFKqOtLqlSq17Mv5Wv/7QuIXEZ46coSYjAxWdOlCrXzOqZ1NPMuY1WOITIzk96Hf0nL4wzB0\nKLz2WsVdcKyUUiqH1vxVqSQdTCJoYBCtZrfK6dwHMPfUKTbExPB1x47UyWcQn5+O/ES3j7rR1bcr\nWwd+TstbR8M992jiV0qpS6hENX9jdY0cCbQSkZeNMS0APxH5vUKiU5VS0uEkgv4ZRMtXWuZczgew\n8uxZ5p46xdbu3WloN3AHQEpGCs+uf5Yv93/J8juX0zerBfQbAJMmwZQpl3oXlFKqRitpzf8/wLXA\nfbbn8cC8co1IVWrJx5MJGhCE/7/8aTLmwsjOv8bGMvHwYdZ06kQLV9dcr/k78m+u/vhqQs+HEvRI\nEH1T/OCGG2DaNE38SinlACVN/leLyEQgBUBEYoDCh2tT1UbKyRSCBgTRYnoLmo5vmjP/QGIid+3b\nx7IOHehmNyCPiPDhzg+54dMbeLzX43x595c0PnwK+veHWbPg0UcdsRtKKVXjlbTDX7oxxgnIvsbf\nG8gq96hUpZN6JpWgAUE0m9SMZhMvXLoXkZbG4OBgXm/VikF2t748l3SOcd+O49T5U/w65lfaebWD\nnTutjn3vvw/DhztiN5RSSlHymv97wNeAjzHmVeBX4LVyj0pVKmln0wgaEITfaD+aP9U8Z35iZiZD\ng4N5wNeXMU0unAJYf2w93T7qRjvPdmwft91K/L/+CkOGwMcfa+JXSpUbDw8PTpw44egwqpwSJX8R\n+QyYBrwOnAFuE5GVFRGYqhzSo9MJGhSE953e+D9/4eY6GVlZ3LNvH53q1mVGQAAAaZlpPL3uaR78\n5kEW37aYNwa+QW2n2rB+Pdx+OyxbBsOGOWhPlFLlrWXLlmzcuBGAxYsX06dPnwrdXr9+/Vi0KPe9\n5OLj4wmw/QaVp3nz5tGzZ09cXV0ZO3bsRcs3bNhAhw4dqFevHgMGDCA0NLTcY6hIpRnh74CIzBOR\nD0Rkf0UEpSqHjPgM9ty8h0YDGhHwckDOfBHh8SNHSBNhweWXY4zhwLkDXPPxNRyOPszuR3YzoNUA\na+XvvoMRI2DVKhg0yDE7opSqcMW57W5hKttNc5o1a8aLL77IuHHjLloWFRXFnXfeyauvvkp0dDRX\nXnkl99xzjwOiLAMRKfYE/Cu/qSRllPdk7YIqbxlJGbKr7y458PABycrKyrVsdkiIdPn9d4lLT5es\nrCxZ8McC8XrDSz7c+WHudf/3PxEfH5EdOy5x9EpVH5X5Ny4gIEA2bNgg+/fvF1dXV3F2dpZ69epJ\no0aNREQkNTVVpkyZIi1atBA/Pz959NFHJSUlRUREAgMD5bLLLpM5c+aIn5+fPPDAAxITEyNDhw4V\nb29vady4sQwdOlTCwsJEROT5558XJycncXNzEw8PD3n88cdFRMQYI0ePHhURkbi4OLn//vvF29tb\nAgICZNasWTmxfvrpp/KPf/xDpk6dKo0aNZJWrVrJjz/+WOQ+vvDCCzJmzJhc8xYsWCDXXXddzvPE\nxERxc3OTgwcP5ltGRXyGtjJLnTtLWvNPtJsygZuBgHI4BlGVSFZaFvvu3EftZrW5/D+X5zqaXxER\nwbywMH7o0oX0tDju/N+dzNs5j00PbuKRqx65sO7SpfDEE7BuHfTq5aA9UUpdCu3bt+ejjz7i2muv\nJT4+nujoaACmT5/OkSNH2LNnD0eOHCEsLIyXX34553Xh4eHExsYSGhrKggULyMrKYuzYsZw8eZLQ\n0FDc3d2ZOHEiYN1lr0+fPnzwwQecP3+e9957D8h9Z75JkyYRHx/PiRMnCAwMZMmSJXzyySc5y3//\n/Xc6dOhAVFQUTz/9dL61+uLYt28fXbt2zXnu7u5OmzZt2LdvX6nKc4QS9fYXkbfsnxtj3gTWlmtE\nyqGyMrLYP3I/terUov2n7TFOF/6xNsXG8uSRI2zo2pVDp7fxwDcPcPcVd7PizhXUca5zoZD58+GV\nV2DjRujQwQF7oVTNYWaWz8iYMqP87xy4cOFCgoODadCgAQDPPPMMI0eOzLk1rpOTEzNnzsTFNihY\nnTp1uP3223MeP/vsswwYMKDwuG33mcvKyuKLL75gz549uLu74+/vz5QpU1i6dGnObX39/f1zzt+P\nHj2aiRMncvbs2ZxbEBdXQkLCRa+pX78+8fHxJSrHkco6tr87cFlJX2SM+S8wFIgQkS4FrNMXmAu4\nAJEi0q8McapikCzh0PhDZJzPoPO3nanlfKFhaH9iIsP37WNJu7Ys/+1VFgctZtGti7ipzU25C5k7\nF957DzZtgtatL/EeKFXzVETSLg+RkZEkJSVx5ZVX5szLysrKdWtbb2/vnMQPkJyczOTJk1m7di2x\nsbGICAkJCcXqT3Du3DkyMjJo0aJFzjx/f3/CwsJynvv5XRiR1M3NLaf8kib/evXqcf78+Vzz4uLi\n8LAb56SyK+nwvsHYrvEHnABv4OWCX1GgT4D3gSUFbKcB1siBg0QkzBjjVYptqBIQEY5OOUrS4SS6\nru1KrToXEn94aiqDg4OZ6luPF78egk9dH3Y/shufunn+YV59FRYvthK/3T+gUqr6y5ucvby8cHd3\nZ9++fTSxuxS4sNe89dZbHD58mJ07d+Lt7U1QUBA9evTISf6FHQB4eXnh4uJCSEgI7du3ByAkJIRm\nhdxSvLQ6duzI4sWLc54nJiZy9OhROnbsWO7bqiglPec/FBhmmwYBTUXkg5JuVER+BWIKWWUEsEpE\nwmzrnyvpNlTJhLwSQswvMXT+rjNOdS/cUjchI4OhwcF0k9PM+WoAo7uO5rv7vsud+EXg+edhxQpN\n/ErVUL6+vpw6dYr09HTASuzjx49n8uTJREZGAhAWFsa6desKLCM+Ph43Nzfq169PdHQ0L7300kXb\nOHbsWL6vrVWrFsOHD+f5558nISGBkJAQ5s6dy/3331+q/cnMzCQlJYXMzEwyMjJITU3NuSLh9ttv\nZ9++fXz99dekpqYyc+ZMunXrxuWXX16qbTlCSa/zD7GbwkQko4LiuhxobIz5xRiz0xhTuk9PFcup\nd08RsSyCrmu74tLwQhNcRlYWd+wNIvrcTg7vnsEvo39hUq9JuY++RWDyZPjxRwgMhAKO8JVS1Y/9\nb0H//v3p2LEjfn5+Oc3os2fPpk2bNlxzzTU0bNiQQYMGcejQoQLLmzx5MklJSXh5edG7d28GDx6c\na/mTTz7JypUr8fT0ZPLkyRfF8N577+Hu7k6rVq24/vrrGTVqVM75/qLiz2vWrFm4u7szZ84cPvvs\nM9zd3XP6Knh5ebFq1Sqee+45GjduzB9//MHnn39eyDtV+Rj78y8FrmRMPBea+3MtwrrcoH6JN2yM\nP7Amv3P+xpj3gSuB/kBdYDswWESO5LOuzJgxI+d537596du3b0nDqbHCF4dz/MXjdN/SHVf/Czfk\nERFu/WsTP4ftYYzzEd4aOAc3F7fcL87MtMbn37sXfvgBGja8xNErVf0ZYyjO77SqvMrjMwwMDCQw\nMDDn+cyZMxGRUvf2LFbyrwhFJP/pgKuIzLQ9/xj4UURW5bOu6D9G6Zz79hyHJhyi6y9dqdu+bs78\n9Mx0bty0mC0pzixv5c3d7Ydc/OKMDHjwQQgLgzVroF69Sxe4UjWIJv+qryI+Q1uZpU7+Je7tb4xp\nBLQFcqqJIrK5FNs2tik/q4H3bTcRqgNcDbxdim2oAsRujuXgQwfp/EPnXIn/WMwxblz3Bqc8b2bn\nNT3o1rj5xS9OS7NG7UtMtGr8bm4Xr6OUUqrSKmlv/4eAJ7Eu79sNXIPVJN+/hOUsB/oCnsaYUGAG\n1n3J0OoAACAASURBVK2BRUQWiMgBY8xaYA/WYEILROTvkmxDFSx+dzz77trHFSuuoP5VF87YLNuz\njEnbFpLZ/gV+v+oaOtfL57KV5GS46y6oXRu++Qbq1Ll4HaWUUpVaiZr9bZf69QR+E5Fuxpj2wGsi\nckdFBViMmLTZvwSSjyaz6/pdtHm3DT53WZ1y4lLieOyHx/gt+gyx7WawslMX+jdqdPGLExLgllvA\nz8+6pM/u+lylVMXQZv+qrzI2+5f0Ur8UEUmxbbiOiBwA2pV24+rSSj2TStCgIAJmBOQk/m0nt9Ft\nfjdcXH3J7DiLd9q2yz/xx8XBjTdCq1bW0L2a+JVSqsoq6Tn/U8aYhsA3wM/GmBggpPzDUuUtI866\nQ5/fGD+aPtyUjKwMXt38Kh/+8SHvDJ7Pv5Oa8ZCXF/fbjYCVIyrKSvy9e8M770CtEt8MUimlVCVS\n3Ev95gHLRWSr3bwbgAbATyKSVnEhFhmbNvsXITMlk+Cbg3Hv6E7b99sSEhfCqK9G4ersyqLbFvPY\niSj8atdmYbt2F1/3Gh4OAwfCkCHw+utQhlt2KqVKTpv9q76q3Ox/CHjTGHPCGPOGMaa7iGwSkW8d\nmfhV0SRT2D9qPy7eLrR9ty2f7/2cXgt7cVv721g7ai2vhyeSIcKHl19+ceI/dQpuuAGGD9fEr5RS\n1UhJO/z5A/faJjdgBbBCRAoesqmCac2/YCLC4UmHSdqfRMtvWvLExifYcWoHy+9cTo8mPZgTGsqK\niAg2d+9Ofec8Z4COHYN//hMmTYKnnnLMDiiltOZfBA8PD4KDgwkICHB0KAWqyjV/IGd43zki0h24\nD7gN2F/ajauKFTIr5P/bu/Owqqr98ePvhSJ4FFREAScGhyRyAK200lBvZl6vWZqVaSWlXlOTrlqa\n9cssy+xres3rdShxylLT0i6OYTiXOTIoIg6AqIgikyjTWb8/Dp5ARZHpMHxez8PzcPZee+21l0c+\ne6+9BlL2pnBj7g18lvhgU82Gg8MP4uPiw/fx8cyLiyOwbdvbA39EhOmJf8IECfxCiAK5u7uzfft2\nAJYuXUqXLl1K9XzdunVj8eLF+balpqaWSuD/z3/+w8MPP4ytra15GeCboqOjsbKywt7eHjs7O+zt\n7c1T/1YU9zvOvzrwDKYn/x5AMDClxEsliu3Ctxe4GHCRnTN3MnPjTP779//yvKdpRObOpCTGRkUR\n1K4djW8dpx8SAr16wWefmWbwE0KIQijMsrt3k5OTQ7Vq1e6dsIw0btyYDz/8kC1btnD9+vXb9iul\nSE5OLtY1W1KhnvyVUk8ppRYD54BhQCDQXGv9ktZ6fWkWUNy/KxuvEPV+FDOGzWBTyiYODj9oDvzH\nr13jhfBwVnp60ubWKXkPHICePWHWLAn8QohCi4iIYOTIkezbtw87OzscHBwAyMzMZPz48bi6uuLi\n4sJbb71FRkYGADt27KBp06bMmDEDFxcX/Pz8SEpK4h//+AcNGzakfv36/OMf/+D8+fMAfPDBB+za\ntYvRo0djb2/P22+/DZhW87u50l9KSgqvvvoqDRs2xN3dPd/T+M2WiQkTJuDg4EDz5s3ZvHlzgdfU\nr18/+vbta76WW2mtMRqNxa88Cylss/8kYC/gqbXuq7VeqbW+VorlEkWU8mcKRwcfZeILE3m0y6P8\nOuRXmtg3ASA+M5O/h4Yyo3lz/nbrF3rPHujdGxYtghdftEDJhRAVVevWrZk/fz6dO3cmNTWVxMRE\nAN577z2ioqIICQkhKiqKuLg4pk6daj7u4sWLJCUlERMTw8KFCzEajfj5+REbG0tMTAwGg4FRo0YB\nplX2unTpwty5c0lJSWHOnDlA/pX5Ro8eTWpqKmfPniU4OJhly5YREBBg3r9//348PT25cuUKEyZM\n4I033ijyNSulcHNzo1mzZvj5+XHlypUi52URWusK/WO6BKG11gnhCTqwXqDuP6y/3n9uf759adnZ\nusOff+opZ87cfuCvv2rdoIHWW7eWTUGFEIV2z79xpoW1i/9TBG5ubjooKEhrrfWSJUt0ly5d8u2v\nVauWPn36tPnz3r17tbu7u9Za6+DgYG1jY6MzMzMLzP/w4cPawcHB/NnX11d/++23+dIopfSpU6d0\nTk6OrlGjho6IiDDvW7Bgge7WrZu5fC1btjTvS09P11ZWVjo+Pv6u1/jBBx/ooUOH5tuWlpamDx48\nqHNycvSlS5f0gAED9NNPP11gHqURp3LzLHLsvO+FfUT5tD9kP2d7nOXUS6dYMnsJtWv81aSfbTTy\n0rFjtKldm//n6pr/wMBAGDoUfvwRunYt41ILIYqtnI4ESEhIID09nQ4dOpi3GY3GfL3eGzRogHWe\n2UKvX7+Ov78/W7ZsISkpCa01aWlphepPcPnyZbKzs2nWrJl5m6urK3FxcebPznkmMatZs6Y5/4YN\nG97XtdWqVQsfHx/zNcydOxcXFxeuXbtGrVq17nF0+SBTtVVwRm3ky21fcrTPUQzPG5g0b1K+wK+1\n5u2oKDKMRhbeOpb/xx/Bz8+0JK8EfiFEMdwanB0dHTEYDISHh5OYmEhiYiJJSUkkJycXeMzMmTM5\nefIkf/75J0lJSezcaVow9uYNw91uABwdHbG2tiY6+q9JZ6Ojo2ncuHGxr60wlFIVqg+ABP8KLC4l\njp5Le1L73dp4P+bN3+f//bY0/xcby57kZH708sI677S8y5fDmDGwZQs8+mgZlloIURk5OTlx7tw5\nsrKyAFMwHDZsGP7+/iQkJAAQFxfH1q1bC8wjNTWVmjVrYm9vT2JiIlOmTLntHDc7993KysqKgQMH\nMnnyZNLS0oiOjmbWrFkMGTKkSNeTk5PDjRs3yMnJITs7m4yMDHJycgBT34HIyEi01ly5coWxY8fS\nrVs37OzusBJqOSXBv4L66fhP+CzwwW+DH53rd8Znmc9td8WrL11iTlwcgW3a5B/Lv3AhTJoE27dD\n+/ZlXHIhRGWR929O9+7d8fLywtnZ2dyMPn36dFq0aEGnTp2oW7cuPXv2JDKy4Dnh/P39SU9Px9HR\nkccee4zevXvn2z927FjWrFlD/fr18ff3v60Mc+bMwWAw4OHhQdeuXRk8eDBDhw4tVPlv9emnn2Iw\nGPjiiy/47rvvMBgM5tEDp0+fplevXtjb29O2bVtsbW1ZuXLlXWqq/LmvGf7Ko6o2w9+1zGv8a8u/\n2HZ6G8sSlmGzwQbvXd5Ur5O/+8aupCT6h4ezrV072uUd0jd7tunn11+hRYsyLr0Q4n7JDH8VX4Wf\n4U9Y1uELh+mwsAPXs6/zm+NvVFtajTYb29wW+E+kpzMgPJwVnp75A/9nn8F//gM7d0rgF0KIKkx6\n+1cARm1k9u+zmb57OrN7zaZ3cm/Cnw+n3bZ22DaxzZc2PjOT3iEhfO7hQc+bY/m1hsmTYf16U+B3\ncbHAVQghhCgvJPiXcxdSL/Daz6+RlpnGH2/+gdNlJw4/dRjP5Z7Ubpd/hr70nBz6hoYy2MkJv5sB\nXmvw94ddu2DHDnB0tMBVCCGEKE+k2b8c++XEL3gv8Oaxpo+xc+hOGuc0JrR3KO6fuOPwdP4Z+nK0\nZtCxY7Q2GJhyc5GLnBwYMQL27zd17pPAL4QQAnnyL5fSs9IZv3U8m6I2sXbgWh5v9jg5N3IIezaM\nBgMa0GhYo3zptda8ExVFak4Oq728TD1Ys7NNk/ecOwdbt0IFGoIihBCidEnwL2dC4kN4ee3LtHNq\nx+ERh6lrWxdt1ES8FoFNUxvcp7nfdszsc+fYfvUqu729qWFlBZmZ8PLLcO2aaQY/g8ECVyKEEKK8\nkuBfThi1kTl/zGHarml81fMrBrcdbB6DeuaDM2TEZdDu13Yoq/wjO9YmJDAzNpa9Pj7UtbaG69eh\nf3+wsTF18Lt1yV4hhBBVngT/ciA+LZ7X17/O1etX+f2N32nu0Ny870LABS6tvoTP7z5Us82/1vXe\n5GRGRkaypW1bmtnaQloa9O0LTk6wbBnkmTNbCCGEuEk6/FnYxpMb8V7gTUeXjuwauitf4L/621VO\nTzxNm/+1oYZjjXzHnUxPp394OEtbt8bbzg6Sk+Hpp8HdHVaskMAvhKgS7OzsOHv2rKWLUeFI8LeQ\nG9k3eHvT24wMHMkPA37gk+6fYF3tr4CdfiKdYy8d48EfHqRW6/yrRCVkZtI7NJSpbm48U78+XLkC\nPXqAtzcsWgTVqt16OiGEKHHu7u5s374dgKVLl9KlS5dSPV+3bt1YvHhxvm2pqam43RzhVEIyMzN5\n8803cXNzo06dOvj4+LB58+Z8aYKCgvD09KR27dr06NGDmJiYEi1DaZPgbwFhl8J4ZNEjXEy7yJER\nR+jqmn9FvczLmYT8PQSP6R7U61Yv377rOTn0DQtjYIMGDGvUCC5eBF9fU/D/+muwkn9SIUTZK8yy\nu3dzc9Gc8uDm0sC7du0iOTmZTz75hIEDB5oD/JUrV+jfvz/Tpk0jMTGRDh068OKLL1q41PdJa12h\nf0yXUDEYjUY994+52nGGo158aLE2Go23pcm5kaMPPXFIn5p46rZ92Uajfj40VA8KDzcdGxurdatW\nWk+dqvUd8hJCVHzl+W+cm5ubDgoK0sePH9e2tra6evXqunbt2rpevXpaa60zMjL0uHHjdLNmzbSz\ns7MeOXKkvnHjhtZa6+DgYN2kSRP9xRdfaGdnZ/3qq6/qq1ev6j59+ugGDRpoBwcH3adPHx0XF6e1\n1nry5Mm6WrVqumbNmtrOzk6PGTNGa621UkqfOmX6e5mcnKyHDBmiGzRooN3c3PSnn35qLuuSJUv0\nE088ocePH6/r1aunPTw89KZNmwp9rW3bttXr1q3TWmu9cOFC/fjjj5v3Xbt2TdesWVOfOHHijseW\nxr9hbp5Fjp3ymFhGEq4l0PeHvgQcCWCP3x6Geg+97S5Za82J4SewdrK+45C+CadOcSUri8WtW6PO\nnoWuXWH4cPjwQyjGHbcQQhRH69atmT9/Pp07dyY1NZXExEQA3nvvPaKioggJCSEqKoq4uDimTp1q\nPu7ixYskJSURExPDwoULMRqN+Pn5ERsbS0xMDAaDgVGjRgGmVfa6dOnC3LlzSUlJYc6cOUD+lflG\njx5NamoqZ8+eJTg4mGXLlhEQEGDev3//fjw9Pbly5QoTJkzgjTfeKNT1xcfHExkZyUMPPQRAeHg4\n7dq1M+83GAy0aNGC8PDwItZg2ZPe/mVg66mtDF0/lCFth7B24FpqVKtxx3Qx02O4Fn4N753etw3p\nm3PuHJsTE9nj7Y3NyZPw1FMwcSK89VZZXIIQopxSwcElko/29S2RfPJatGgRoaGh1KlTB4CJEyfy\nyiuvmJfGrVatGh9//DHWuR2UbWxseO6558y/T5o0iR49ety93Lmr5RmNRlatWkVISAgGgwFXV1fG\njRvH8uXLzcv6urq64ufnB8Brr73GqFGjuHTpknkJ4jvJzs42Lw3csmVLANLS0m47xt7entTU1Puq\nH0uS4F+KMrIzeD/ofVYfW83y55bT3b17gWkT1iVwft55fP7woZohf4e9nxMS+CImhj3e3tSLiIBe\nvWDaNHj99VK+AiFEeVcaQbskJCQkkJ6eTocOHczbjEZjvqVtGzRoYA78ANevX8ff358tW7aQlJSE\n1pq0tLRC9Se4fPmy+V39Ta6ursTFxZk/Ozs7m3+vWbOmOf+Cgr/WmsGDB2NjY8PXX39t3l67dm1S\nUlLypU1OTsauAs2kapFmf6XUt0qpeKVUyD3SPayUylJKPV9WZSspxxOO0+nbTpxOOs2REUfuGvhT\nD6YSOSKSh9Y/hE2j/JPy/JGSwrDISNY/9BBu4eGmJ/6vvpLAL4QoV24Nzo6OjhgMBsLDw0lMTCQx\nMZGkpCSSk5MLPGbmzJmcPHmSP//8k6SkJHbu3An89XR/txsAR0dHrK2tiY6ONm+Ljo6mcePGRb6m\nN954g8uXL7Nu3Tqq5RlF5eXlxZEjR8yfr127xqlTp/Dy8iryucqapd75BwBP3y2BUsoKmA5sKZMS\nlRCtNQsOLKDrkq6M7DiSdQPXUd9Qv8D0GXEZhPULo9XCVtj55L9rPHX9Ov3Cwgh44AE6hoZC796w\ncCFUtF6lQohKz8nJiXPnzpGVlQWYAvWwYcPw9/cnISEBgLi4OLZu3VpgHqmpqdSsWRN7e3sSExOZ\nMmXKbec4ffr0HY+1srJi4MCBTJ48mbS0NKKjo5k1axZDhgwp0vX885//JCIigg0bNlCjRv5Xtc89\n9xzh4eH89NNPZGRk8PHHH9O+fXtatWpVpHNZgkWCv9Z6N3D1HsnGAD8Cl0q/RCXjSvoVnl/9PPMP\nzmfX0F0M7zD8rneqOek5hD4bSqNRjWjwXIP8eWVl0TskhP/n6kqfo0ehXz/T5D19+5b2ZQghRKHk\n/fvWvXt3vLy8cHZ2NjejT58+nRYtWtCpUyfq1q1Lz549iYyMLDA/f39/0tPTcXR05LHHHqN37975\n9o8dO5Y1a9ZQv359/P39byvDnDlzMBgMeHh40LVrV/O7+sKUP6+bHRCPHDmCk5MTdnZ22Nvb8/33\n3wOmVoa1a9fy/vvv4+DgwIEDB/jhhx/uUVvli8r7/qVMT6yUK/CL1rrtHfY1Ar7TWndTSgXkpltX\nQD7aUteQV9DpIF5f/zoDHxzIZz0+w6b63efU10bNsZeOYWVrReulrfN9CW/k5PC3o0d5vE4dvoiI\nMK3Ot2YNPPlkaV+GEKKcUUpRHv7GiaIrjX/D3DyLPMyrvHb4mw28l+dzuR3HlpmTyYfbP2RF6AqW\nPLuEp5o/Vajjzk49S0ZsBu1+a5cv8Bu15rWICJrY2PD54cMwahT88gs8+mhpXYIQQogqprwG/47A\nD8oUFR2BZ5RSWVrrDXdKnPe9kK+vL75l1Ps18kokg9YOopFdI46MOEKDWg3ufRBwafUlLgZcNPXs\nv2WxnomnT3M+M5NtYWFYvfsubNkC7duXRvGFEEJUEMHBwQSX0LBOsGyzvxum5vw290hX7pr9tdYs\nPryYiUET+dj3Y0Z2HFnoaS1TDqQQ+kwobbe1xa59/g5+8+LimHPuHHtDQ3GYMgW2bQNPz1K4AiFE\nRSHN/hWfNPvnUkqtBHyB+kqpGOAjoAam6QoX3pK8XH3rE68nMvyX4UReiST4tWC8GhZ+aEfGhQzC\nnwun1YJWtwX+Xy5f5tPoaHYfOYLDjBkQHAwtWpRw6YUQQggLPvmXlLJ88g8+G8yrP73K857PM/1v\n07GtblvoY3Nu5HDkySPU71Mftw/d8u07kJLCM6GhBB44wCNz50JQEOSZqEIIUXXJk3/FJ0/+FVRW\nThYfBX/EkiNL+LbvtzzT8pn7Ol5rTeTwSGxdbXH9wDXfvjPXr/NsWBjf7N/PI998Azt3gotLSRZf\nCCGEyEeC/z1EJUYxaO0gHA2OHB5xGKfaTvedR+zMWK6FXcN7t3e+vgFXs7LoHRrKxAMHeHb5ctix\nAxwdS7L4QgghxG1kVb8CaK1ZemQpnb/tzJC2QwgcFFikwH9l4xXOfXWOh9Y/lG/O/gyjkX6hofQ+\neJAx338P27dL4BdCCFEmJPjfQdKNJAatG8SMvTMIejWIMY+OKXRv/ryuRVwj4vUIvH70wrbpX/0D\njFoz9PhxGhw9yperV8PWrVC3bkleghBCWExsbCz29val0lfBysqqwCl+i2rlypX06tWrRPMs7yT4\n32J3zG7az29P/Zr1OTDsAG2dbpuAsFCykrIIezYMj+ke1HmsTr59H0RFcTYkhOVr12IVGAgVaCUo\nIYS4yc3NDYPBgL29vXkK3IsXL9K0aVNSUlKK9NB0L3fL09fX17w2QMOGDenfvz/x8fH3zHPQoEFs\n3ry5UOdfunQpXbp0KXR5yysJ/rmyjdl89NtHDFg9gLm95zK391xqWtcsUl46R3N80HEcejng4pe/\n897C6Gh+DA1lw4YN1Fy7FgyGkii+EEKUOaUUgYGBpKSkkJqaSkpKSr5lc0vD3VoTlFLMmzePlJQU\nIiMjSUpK4p133inx85fGTU1Zk+APnLl6hq4BXfk97ncOjzhMn1Z9ipXf6cmnMWYYaf5/zfNt3xQX\nx0chIWzcsgXHZcvA5u7z/wshRHl3p2AcHR2NlZUVRqORq1ev0rRpUwIDAwHT8rctW7ZkxYoVAGRm\nZjJ+/HhcXV1xcXHhrbfeIiMjw5zXl19+SaNGjWjSpAkBAQH3DLw3y1O3bl369+9PWFgYACkpKbz6\n6qs0bNgQd3d3pk2bZj7m1qd5KysrFixYQKtWrXBwcGD06NEAREREMHLkSPbt24ednR0ODg5FqbJy\nocoH/+9CvuORbx5hwIMD2PTKJlzsijfMLv77eBJWJ+C12gsr67+q99CFC7x2+DDrdu+mxbx5YG1d\n3KILIUS5dTNI16tXj8WLFzNs2DASEhLw9/fHx8eHwYMHA/Dee+8RFRVFSEgIUVFRxMXFMXXqVAA2\nb97MV199RVBQECdPnuTXX38t9PkvX77M2rVr8fHxAWD06NGkpqZy9uxZgoODWbZsGQEBAbeV96bA\nwEAOHjzI0aNHWb16NVu3bqV169bMnz+fzp07k5qaSmJiYrHqyJKq7FC/lIwURm0cxYHzB9g2ZBvt\nnYs/f37qoVSixkbRLqgd1vX/Cu4xFy7Q948/mH/8OJ0//xysqvw9lxCihASr4BLJx1f7Fum4fv36\nUb26KZT4+vqybt3tM7E/9dRTvPDCC/To0YOrV68SEhJi3rdo0SJCQ0OpU8fUN2rixIm88sorTJs2\njTVr1jB06FA8c6c5nzJlyj2Xzh0zZgzjx4+nVq1a+Pr6MnPmTIxGI6tWrSIkJASDwYCrqyvjxo1j\n+fLlBS75O2nSJOzs7LCzs6Nbt24cOXKEnj17FqmOyqMqGfz3xe7jlXWv0LN5Tw4OP4jBuvjv3TMv\nZRL2fBit/tuK2m1qm7cnnT9P7+BgxiUn8/zEiVAJ3hUJIcqPogbtkrJ+/Xq6det2z3TDhg3j66+/\nZvLkydSrVw+AhIQE0tPT6dChgzmd0Wg0N92fP3+ejh07mve5urrecwTB119/jZ+fX75tly5dIjs7\nm2Z5Zk51dXUlLi6uwHycnP4a2m0wGEhLS7vnNVYkVeoRNMeYwyc7PqHfqn589fRXzO8zv0QCvzHL\nSPjAcJwGO9Gg/18r+2XGxtJ/wwZ6aI3/iBES+IUQlU5hhvMZjUaGDx/Oa6+9xrx588xD9RwdHTEY\nDISHh5OYmEhiYiJJSUkkJycD4OLiQmxsrDmf6OjoInW2c3R0xNramujo6Hx5NW7c+L7zqgyd/aAK\nBf/opGh8l/oSHB3MoeGH6Ne6X4nlfWrcKarVrob7x+7mbfr0ad5cvhw7Jye+GjQIJU39QogqJO9N\nwbRp07CysmLx4sWMHz+eIUOGmHvNDxs2DH9/fxISEgCIi4tj69atAAwcOJAlS5Zw/Phx0tPTzX0B\n7peVlRUDBw5k8uTJpKWlER0dzaxZsxgyZMh95+Xk5MS5c+fIysoqUlnKiyoRkVaFreLhRQ/Tt1Vf\ntg3ZRmP7+7/bK8iFJRdI3JKI5wpPVLXcO8ITJ/hozhxOeHuzsm9fqlWSO0UhhMjrbk/BN/cdOnSI\n2bNns3z5cpRSvPfee1hZWTF9+nQApk+fTosWLejUqRN169alZ8+eREZGAtCrVy/8/f3p3r07rVq1\nokePHkUuz5w5czAYDHh4eNC1a1cGDx5c4Pv+W/PJ+7l79+54eXnh7OxMw4YN71qe8qxSr+qXmpHK\nmE1j2Bu7l5X9V9KxUcc7piuqlP0phPYJpf2O9tTyrGXaGBLC4s8/Z5qfH/uefJKGNWqU6DmFEFWL\nrOpX8ZXHVf0q7ZP//rj9eC/wprpVdQ6NOFTigT8zPpPwAeE8sOiBvwL/gQNsHT+e9998k42PPy6B\nXwghRLlU6Xr75xhzmLFnBrN+n8W8v89jwIMDSvwcxiwj4S+E4zzUGcdncxfj2bOHo/7+DP7iC9b5\n+PCAzNwnhBCinKpUwf9cyjmG/DQEozZycPhBmtZpWirnOTXuFNXrVMftIzfThqAgzr31Fn3mz2eu\nlxdPyCI9QgghyrFK0+y/9thaOizswN/c/8b2V7eXWuC/uOwiiZsTab28NcpKQWAgyX5+9F6wgLeb\nN2dgBe4AIoQQomqoFE/+wzYM47ezv7HhpQ082uTRUjtP6sFUTo07Rfvg9ljXtYYffyTr7bcZ8MMP\nPOHszPimpXPDIYQQQpSkShH8s4xZHB5xGDub0lsaNzMhk7D+YbT8b0tqedWC5cvR777L8LVrsbWz\nY06LFpVm8gchhBCVW6Ue6ldSjNlGQnqFYNfRjubTm8PChTB1KlN/+okNSrHD25ta1aqVahmEEFWT\nm5tbvpnpRMXj6urK2bNnSzTP4g71qxRP/qXtzOQzKKXwmOYBs2fD7NksDQwk4Pp19kngF0KUopIO\nGkKABP97SlibwKVVl+hwoANq+mewZAlBW7bw7uXLBLdvj7ONjaWLKIQQQtwXafa/i2vHr3Gk6xHa\nbGyD/c9fwM8/ExoYSI+4ONZ4efGkDOkTQghhAcVt9pfgX4DslGwOPnKQZhOa4hI6A3bsIC4wkMei\no/ncw4NBeZZ7FEIIIcqSBP9SCP5aa8IHhGNdvzoPqFlw9Cip//sfXc6c4cWGDZnk6lqi5xNCCCHu\nh3T4KwWxX8aSEXODB22+hvPRZG3dygtnzvCIvT0TmzWzdPGEEEKIYqk0M/yVlKu/XSX2q1i8GszF\nKjEeHRjIWxcuoJRiXsuWMpZfCCFEhSfBP48b525w/OVjeDb7DtsaSbB+PZ9fvszB1FRWP/gg1a2k\nuoQQQlR8Es1yGTONHHs+lMa1tuDQ/CqsWcN3SUksOH+e/7Vpg111eUMihBCicpDgn+vU6GNYRx2g\n2ZNxsGIFwWlpvBMVRWCbNjSSsfxCCCEqEYsEf6XUt0qpeKVUSAH7Bymljub+7FZKtSnN8sQvmHdy\nowAAC0BJREFUOMWVZRG0HnAS9c0ijt+4wYvHjvH9gw/yUO3apXlqIYQQosxZ6sk/AHj6LvtPA121\n1u2AT4FFpVWQaztiiBp1nIdeOo71gplczMqid2goM5o3p0e9eqV1WiGEEMJiLPIiW2u9WylV4GB5\nrfXveT7+DjQujXJkR8QQ9tRePPokUTvgA9JycugTGspQZ2dec3YujVMKIYQQFlcR3vm/CWwq6Uz1\n6dOc6LiKut5WuPz8T7K15uXjx2lbuzYfyiQ+QgghKrFy3YVdKdUNGAo8UaIZnzhBXKcvue7QH+8d\nPdFa83ZUFBlGIwtatZKx/EIIISq1chv8lVJtgYVAL6311bulnTJlivl3X19ffH19C04cGkpytzFE\nGz/AZ8fjVLOtxpcxMexJTmaXtzfWMpZfCCFEORMcHExwcHCJ5Wexuf2VUm7AL1rr23ryK6WaAUHA\nkFve/98pn8LP7X/gAJm9B3Ew57+0XNoOxz6OrL50iXGnTrHP25smtrb3fR1CCCFEWauQc/srpVYC\nvkB9pVQM8BFQA9Ba64XAh4ADME+Z2uCztNaPFOuke/ag+z3P8cYrcOrtjmMfR3YnJTH65Em2tWsn\ngV8IIUSVUTVW9du+HV58kTNPf09ynCNtt7XlZOYNnjx8mGWenvR0cCibwgohhBAloLhP/pX/BffG\njfDSSyS+u4YLvxnw/N6Ty8ZseoeE8JmHhwR+IYQQVU7lDv5r18LQodz4Zj3HZ1rz4MoHyWlQnX+E\nhvKKkxN+Li6WLqEQQghR5sptb/9iW7ECJkzA+L/NHBurafqOI3Zd69A/LIwHDAY+dnOzdAmFEEII\ni6icT/4LF8LEiRAUxOnv7bCub02T8U14JyqK1JwcvnngARnLL4QQosqqfE/+//43zJoFwcEkhNbh\n8k+n6HCwA/8+H8f2q1fZ7e1NDRnLL4QQogqrXMH/s88gIAB27uR6VgMiRxyizf/asCEniZmxsez1\n8aGutbWlSymEEEJYVOUI/lrDhx/CTz/Bzp3k1GtI+OOHcf3AlfAHNCPDItnSti3NZCy/EEIIUUmC\n/7/+BcHBpp8GDTg1KhJbd1vS36jH80ePsrR1a7zt7CxdSiGEEKJcqBzBf98+00Q+9eoR/0M8iVsS\ncd/XlifCQpnq5sYz9etbuoRCCCFEuVE5ZvhLSQE7O9Ij0zn8+GEe2PQQfa1O0a1uXaZ5eFi6iEII\nIUSJKu4Mf5Uj+GtNzvUcDnU+hMuIRvh3uYqNlRUrPD1lSJ8QQohKp0Iu7FMaot6JwtDawKy/pXM5\nLYst7dpJ4BdCCCHuoFIE//jv40kKSuLABhc2Xb3IHm9vbGQsvxBCCHFHlaLZf7fjbhJXNeOftrHs\n8fbGrWZNSxdLCCGEKDXS7A/wvjNv2MSw8aE2EviFEEKIe6gUbeMvPHKRxQ88QEd7e0sXRQghhCj3\nKkXw/8DNjT6OjpYuhhBCCFEhVIp3/hX9GoQQQoj7Udx3/pXiyV8IIYQQhSfBXwghhKhiJPgLIYQQ\nVYwEfyGEEKKKkeAvhBBCVDES/IUQQogqRoK/EEIIUcVI8BdCCCGqGAn+QgghRBUjwV8IIYSoYiT4\nCyGEEFWMBH8hhBCiipHgL4QQQlQxFgn+SqlvlVLxSqmQu6SZo5Q6qZQ6opRqX5blE0IIISozSz35\nBwBPF7RTKfUM0Fxr3RIYAcwvq4KJ2wUHB1u6CFWC1HPpkzoufVLHFYNFgr/Wejdw9S5JngWW5ab9\nA6ijlHIqi7KJ28l/5rIh9Vz6pI5Ln9RxxVBe3/k3BmLzfI7L3SaEEEKIYiqvwV8IIYQQpURprS1z\nYqVcgV+01m3vsG8+8JvWelXu5wjgSa11/B3SWuYChBBCCAvSWquiHlu9JAtyn1Tuz51sAEYBq5RS\nnYCkOwV+KN7FCyGEEFWRRYK/Umol4AvUV0rFAB8BNQCttV6otd6olOqtlIoCrgFDLVFOIYQQojKy\nWLO/EEIIISyjQnf4U0r1UkpFKKUilVLvWbo8lYFSqolSartSKlwpFaqUejt3ez2l1Fal1Aml1Bal\nVB1Ll7WiU0pZKaUOKaU25H6WOi5BSqk6Sqk1Sqnjud/nR6WOS55SalJu/YYopb5TStWQei6eO02E\nd7c6zf03OJn7Xe9ZmHNU2OCvlLIC5mKaLMgLeFkp1dqypaoUsoF/aa29gM7AqNx6nQj8qrV+ANgO\nTLJgGSuLscCxPJ+ljkvWv4GNWmtPoB0QgdRxicrtuD0M8M7tvF0deBmp5+K600R4d6xTpdSDwEDA\nE3gGmKeUumdfuAob/IFHgJNa62itdRbwA6bJgUQxaK0vaq2P5P6eBhwHmmCq26W5yZYC/SxTwspB\nKdUE6A18k2ez1HEJUUrZA1201gEAWutsrXUyUsclLQXIBGoppaoDNTHNyyL1XAwFTIRXUJ32BX7I\n/Y6fBU5iio93VZGD/60TAZ1DJgIqUUopN6A98DvgdHPEhdb6ItDQciWrFGYBE4C8nW6kjkuOO3BZ\nKRWQ+2ploVLKgNRxidJaXwVmAjGYgn6y1vpXpJ5LQ8MC6rRIk+JV5OAvSpFSqjbwIzA2twXg1p6h\n0lO0iJRSfwfic1tY7tY8J3VcdNUBH+A/WmsfTKOGJiLf4xKllPIA3gFcgUaYWgBeQeq5LBSrTity\n8I8DmuX53CR3myim3Oa7H4HlWuv1uZvjb66voJRyBi5ZqnyVwONAX6XUaeB7oLtSajlwUeq4xJwD\nYrXWB3I/r8V0MyDf45LVEdijtU7UWucAPwGPIfVcGgqq0zigaZ50hYqFFTn4/wm0UEq5KqVqAC9h\nmhxIFN9i4JjW+t95tm0AXs/9/TVg/a0HicLRWr+vtW6mtfbA9L3drrUeAvyC1HGJyG0ejVVKtcrd\n1AMIR77HJe0E0EkpZZvbyawHpk6sUs/Fd+tEeAXV6QbgpdxRFu5AC2D/PTOvyOP8lVK9MPXotQK+\n1VpPt3CRKjyl1OPATiAUU7OSBt7H9GVajekOMxoYqLVOslQ5Kwul1JPAOK11X6WUA1LHJUYp1Q5T\nh0pr4DSmycKqIXVcopRSEzAFpRzgMPAmYIfUc5HlnQgPiMc0Ed7PwBruUKdKqUnAG0AWple1W+95\njooc/IUQQghx/ypys78QQgghikCCvxBCCFHFSPAXQgghqhgJ/kIIIUQVI8FfCCGEqGIk+AshhBBV\njAR/IYSZUmqyUipMKXU0d078h5VSY5VStoU4tlDphBCWJ+P8hRAAKKU6YVqk5UmtdXbupEM2wF6g\ng9Y68R7HnylMOiGE5cmTvxDiJhfgstY6GyA3iA/AtGDLb0qpIACl1Dyl1H6lVKhS6qPcbWPukK6n\nUmqvUuqAUmpV7qp6QohyQJ78hRAAKKVqAbsxrckeBKzSWu/MXYCoQ+7yrSil6mqtk5RSVrnpxmit\nw/KmU0rVB9YBvbTW15VS7wI2WutPLHJxQoh8qlu6AEKI8kFrfU0p5QN0AboDP+TOGQ75Fxh5SSk1\nDNPfD2fgQSCM/AuRdMrdvid3wRdrYF/pX4UQojAk+AshzLSpKXAnsFMpFYpp9TAzpZQbMA7TE36K\nUioAuFMnPwVs1Vq/UrolFkIUhbzzF0IAoJRqpZRqkWdTe+AskArY526zB9KA1Ny1xZ/Jkz4lT7rf\ngceVUs1z8zYopVqWYvGFEPdBnvyFEDfVBr5WStUBsoEoYDgwCNislIrTWvdQSh0BjgOxmPoI3LTo\nlnRDge+VUjaYlob+ADhZhtcjhCiAdPgTQgghqhhp9hdCCCGqGAn+QgghRBUjwV8IIYSoYiT4CyGE\nEFWMBH8hhBCiipHgL4QQQlQxEvyFEEKIKkaCvxBCCFHF/H9nbHYY6qVt4AAAAABJRU5ErkJggg==\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": 32, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\nBl0AAAAASUVORK5CYII=\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": 33, "metadata": { "collapsed": false }, "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": 34, "metadata": { "collapsed": false }, "outputs": [], "source": [ "ddp.beta = 0.9999" ] }, { "cell_type": "code", "execution_count": 35, "metadata": { "collapsed": false }, "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": 36, "metadata": { "collapsed": false }, "outputs": [], "source": [ "df_9999 = pd.DataFrame(index=labels, columns=columns)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The numbers of iterations:" ] }, { "cell_type": "code", "execution_count": 37, "metadata": { "collapsed": false }, "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": 38, "metadata": { "collapsed": false }, "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": 39, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "43" ] }, "execution_count": 39, "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": 40, "metadata": { "collapsed": false }, "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": 41, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "581.998786509 \t(Value iteration)\n", "4.37767255306 \t(Value iteration with span-based termination)\n", "0.0 \t(Policy iteration)\n", "4.45491330326 \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": 42, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.0581999123096 \t(Value iteration)\n", "0.0558041036129 \t(Value iteration with span-based termination)\n", "5.96046447754e-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": 43, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.000446990132332 \t(Value iteration)\n", "1160.37531587 \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": 44, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.000893980264664 \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": 45, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Value iteration\n", "1 loops, best of 3: 4.27 s per loop\n", "Value iteration with span-based termination\n", "10 loops, best of 3: 19.3 ms per loop\n", "Policy iteration\n", "100 loops, best of 3: 1.99 ms per loop\n", "Modified policy iteration\n", "100 loops, best of 3: 4.32 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": 46, "metadata": { "collapsed": false }, "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", "
IterationsTime (second)$\\lVert v - v_{\\mathrm{pi}} \\rVert$$\\overline{b} - \\underline{b}$$\\lVert v - T(v)\\rVert$
Value iteration1189004.2675581.9990.000446990.0581999
Value iteration with span-based termination2880.01934394.377671160.380.0558041
Policy iteration70.0019942500.000893985.96046e-08
Modified policy iteration180.004319834.454911099.690.0528918
\n", "
" ], "text/plain": [ " Iterations Time (second) \\\n", "Value iteration 118900 4.2675 \n", "Value iteration with span-based termination 288 0.0193439 \n", "Policy iteration 7 0.00199425 \n", "Modified policy iteration 18 0.00431983 \n", "\n", " $\\lVert v - v_{\\mathrm{pi}} \\rVert$ \\\n", "Value iteration 581.999 \n", "Value iteration with span-based termination 4.37767 \n", "Policy iteration 0 \n", "Modified policy iteration 4.45491 \n", "\n", " $\\overline{b} - \\underline{b}$ \\\n", "Value iteration 0.00044699 \n", "Value iteration with span-based termination 1160.38 \n", "Policy iteration 0.00089398 \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 5.96046e-08 \n", "Modified policy iteration 0.0528918 " ] }, "execution_count": 46, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_9999" ] }, { "cell_type": "code", "execution_count": 47, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\nc+fOHelmSNJKLVU10m2Q1EOSGug1mgRfu6OH4yFJw6P5+zRLcq7LDyRJktR6hlpJkiS1nqFWkiRJ\nrWeolSRJUusZaiVJktR63tJL0qh30UUXcdNNNzFmzBg222wzDjvssJ5lp06dyl133cXqq6/Otttu\ny7777gvANttsw+9//3s23HBDPv/5z3P44Ycvr+ZLkpYDb+kljWJDvaXXJptvwn133bfM2rHx8zfm\n3jvvXezzrrvuOm677TYAbrnlFj7+8Y8vdh0PP/wwe+yxBzNmzABg11135ZJLLuE5z3nOs8reeOON\nvP/97+eyyy4DYO+99+aSSy5hjTXW4IwzzuBv/uZv2HTTTVl11eH9/7y39JKk4bE0t/RyplZaAdx3\n131w7DKs/9jFD8yzZs3ioYceYv/99wdgzz33XKJQe9lll/Gyl71swf6OO+7ItGnTOPDAA59V9tJL\nL2WrrbZasD9u3DiuuOIK9txzT1ZbbTW22GKLxb6+JKkdDLWSlonZs2dz0EEHATBjxgy22247AG67\n7TamTJmy0Oxm33YSJk2axD777LOgnjvvvJOxY8cu2B87diy33HLLgNdcd911efLJJxfsP/7448yZ\nM4c999yTq6++mieeeIKHHnqIbbfddqFrSJLaz1Aradjdc889bL755syaNYszzjiDuXPncvrppwOw\n9dZbc8IJJwy5rgcffJA111xzwf7qq6/O/PnzByy7//77M3XqVADmz5/PzTffzC677ALAXnvttWB9\n7U477cTuu+/OBhtssET9kySNPt79oGWSPJ3kP7v2xyT5Y5KLF7Oe25Ns1Gz/ouv4vyWZleRzSf5X\nkkMXs955i1N+EfVMSzKx2b4kyfpLWd9RfX1JckSSTYajnU19uyfZdaBrrayuvPJKJk2axPbbb8/J\nJ5/MG97wBs4888wlqmu99dZbaL3qY489xkYbbTRg2XHjxjF16lSmTJnCtGnT2H777Rk3bhzAQjOz\nG264IdOnT1+i9kiSRidnatvnEWC7JGtU1V+AvYHfL0E9C1JCVb2m6/h7gA0H/HTSYtY7XKrqLcNQ\nx+ldu+8CbgSG/MmnJGOq6qkeD08G5gO/GuBaK6XHH3+cMWPGLNifM2cO22yzDbDw8oNuvZYfvPCF\nL+Saa65ZsP+nP/2JiRMn9rz2hAkTmDBhAgCf/vSnOf744znnnHO4+OKLOe+88wB45JFHFmqfJKn9\n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\n7fiee+65NE+JJGkZMtRKGnb33HMPm2++ObNmzeKMM85g7ty5nH766QBsvfXWnHDCCUOu68EHH2TN\nNddcsL/qB8KaAAAKA0lEQVT66qszf/78Acvuv//+TJ06FYD58+dz8803s8suu3DkkUcOy3FJ0uhl\nqJU07K688kre+ta3MmbMGE4++WS++tWvcuaZZ/KJT3xisetab731eOCBBxbsP/bYY2yyySYDlh03\nbhxTp05lypQpbLLJJmy//faMGzdu2I5LkkYvQ62kYff4448zZsyYBftz5sxhm222ARZeftCt1/KD\nF77whVxzzTUL9v/0pz8xceLEnteeMGECEyZMAODTn/40xx9//LAelySNUkv6CTN//PFn2f8wxLsf\nAAW1DH8Gbkcv73vf+xZs//GPf6xXvOIV9fDDDy9WHX0eeeSR2n777Rfs77jjjnXfffdVVdWtt95a\nTz/99ILH5s6dWzvssENVVc2ePbsOOOCAYT3ey+I+P5KkgbEUdz9I53xJo1GSGug12v0hq779zp0K\nlllLGOrfFTfddBO33nor8+bNY6211mLWrFkceeSRbLHFFkt89bPPPpu5c+dSVWy99dYccsghAEyc\nOJEzzzyTnXfeGYAnn3ySz372s4wbN47f/va3fOpTn2LDDTcctuM9n50M/fmRJPXW/H2awUsOcK5/\nEUuj11BD7SabbLlEt90aqo03Hs+9984dUtnzzz+ft7/97cusLaORoVaShsfShFrX1EorgKEGzuWh\ney2tJEnLizO10ig21JlajSzHQ5KGx9LM1PqNYpIkSWo9Q60kSZJaz1ArSZKk1jPUSpIkqfUMtZIk\nSWo9Q60kSZJaz/vUSi00fvz45lvENBqMHz9+pJsgSSs971MrjWK97lMrSdKKyPvUShq1pk+fPtJN\nGBYrQj9WhD6A/RhNVoQ+wIrRjxWhD0vLUCtpmVpR/qJdEfqxIvQB7MdosiL0AVaMfqwIfVhahlpJ\nkiS1nqFWkiRJrecHxaRRLIkvUEnSSmVJPyhmqJUkSVLrufxAkiRJrWeolSRJUusZaqURluQNSX6T\n5P8l+XiPMv+R5JYk1yXZaXm3cSgG60eS3ZP8OcnM5ueTI9HORUlyZpL7ktywiDKjeiwG60MbxgEg\nyeZJfpbkpiSzkvxDj3KjdjyG0oc2jEeSNZJcmeTapi//2qPcqB0LGFo/2jAeAElWadp3cY/HR/VY\nwKL7sKTj4NfkSiMoySrAl4HXA3cDVye5qKp+01XmjcALq+pFSV4FnAZMGpEG9zCUfjQuq6p9lnsD\nh24qcArwnwM92IaxYJA+NEb7OAD8FfhwVV2XZF1gRpIft+y1MWgfGqN6PKrqL0n2qKpHk4wBrkiy\nW1Vd0VemBWMxpH40RvV4NI4GZgPr93+gDWPR6NmHxmKPgzO10sh6JXBLVd1RVU8C3wb+tl+Zv6UJ\nKFV1JbBBko2XbzMHNZR+ACzRJ1qXl6r6BfDgIoqM+rEYQh9glI8DQFXdW1XXNdvzgTnA8/sVG9Xj\nMcQ+QDvG49Fmcw062aH/n7FRPRZ9htAPGOXjkWRz4E3AGT2KjPqxGEIfYAnGwVArjaznA7/v2r+T\nZ/+j17/MXQOUGWlD6QfArs3bYT9IMmH5NG1YtWEshqJV45BkS2An4Mp+D7VmPBbRB2jBeDRvFV8L\n3AtMr6rZ/Yq0YiyG0A8Y/ePxReCjQK/bV7VhLAbrAyzBOBhqJS0vM4AXVNVOdJYq/NcIt2dl1apx\naN62/y5wdDPb2TqD9KEV41FVT1fVzsDmwOuS7D7SbVoSQ+jHqB6PJG8G7mveAQijfFZ5IEPswxKN\ng6FWGll3AS/o2t+8Oda/zBaDlBlpg/ajqub3vfVXVf8NrJZko+XXxGHRhrFYpDaNQ5JV6YTBb1bV\nRQMUGfXjMVgf2jQeAFX1MPAD4BX9Hhr1Y9GtVz9aMB67AfskuQ04F9gjSf/186N9LAbtw5KOg6FW\nGllXA9skGZ9kdeBgoP8nQS8GDgdIMgn4c1Xdt3ybOahB+9G9pivJK+l8+csDy7eZQ7Ko2Y82jAUs\nog8tGgeArwOzq+rkHo+3YTwW2Yc2jEeS5ybZoNleC9gbuK5fsVE/FkPpx2gfj6r6l6p6QVVtTefv\n2Z9V1eH9io3qsRhKH5Z0HLz7gTSCquqpJH8P/JjOfzLPrKo5SY7qPFxfq6ofJnlTkt8CjwDvHsk2\nD2Qo/QAOTPI+4EngMeCgkWvxwJJ8C5gMPCfJ74BjgNVp0VgM1gdaMA4ASXYDDgFmNWsgC/gXYDwt\nGY+h9IF2jMemwFlJQuf1/c2q+mnb/p5iCP2gHePxLC0ci2cZjnHwa3IlSZLUei4/kCRJUusZaiVJ\nktR6hlpJkiS1nqFWkiRJrWeolSRJUusZaiVJktR6hlpJ0ohLslGSa5PMTHJPkjub7WuT/GIZXXO7\nJF9fFnUviSRTk+zfbJ+fZMuRbZHULn75giRpxDXfFrQzQJL/A8yvqpOW8WU/Sud75UejKcCHgX8Y\n6YZIbeFMrSRptFnoK36TzGt+755kepL/SvLbJCcmOTTJVUmuT7JVU+65Sb6b5Mrm59XPukDn65wn\nVdXVzf7rumaKZyRZpzn+kab+65Ic03X+4c01r01yVnNsfJKfNmV/kmTz5vjUJCcnuaJp9/5d9Xw5\nyZwkPwbGdTVxGvCm4Xk6pZWDM7WSpNGu+6svdwBeAvwZuB2YUlWvTPIPwAfpzG6eDJxUVb9MsgXw\nI2BCvzp3Bm7u2v8I8P6q+lWStYG/JNkbeFFTf4CLk7wGeIDO193uWlUPJhnb1HEKMLWqzk7y7mZ/\nv+axTapqtyQvBS4GLmzC7Yuq6qVJNgVmA2cCVNVfmyUYL6mq3yzVsyetJAy1kqQ2ubqq/gDQfLf9\nj5rjs4DJzfZewEubIAqwbpK1q+rRrnrGA/d07V8BfDHJOcCFVXVXkv8B7J1kJp3Z43WAFzW/v1NV\nDwJU1Z+bOnblmRD7TeBzXfX/V1N2TpK+GdnXAuc2x+9J8rN+fb0H2BIw1EpDYKiVJLXJX7q2n+7a\nf5pn/k0L8KqqenKQuhYsc6iqzyW5BHgz8Iskb2geP6Gqpix0UvL3PeqrHsf7tzs9Sz27fYuqU1IX\n19RKkka7oYbAPj8Gjl5wcrLjAGXuADbtKrN1Vd1UVZ8HrgFeTGcW+Miu9bWbJXke8DPgbUk2ao5v\n2FTzS+AdzfahwOWD9Ocy4KAkqzTLD/boV27Tpp2ShsCZWknSaNdrtrLX8aOBU5NcD4yhEx7f36/M\ndcC2XfsfSrIH8BRwE/DfVfVkkpcAv2pWMswDDq2q2Uk+C/w8yV+Ba4Ej6dypYGqSjwB/BN7do50F\nUFXfS7Jnc73f0QnFACRZFXi+62mloUuV72xIklY+SaYCp1XVlSPdlv6aD6m9paqOHrSwJMDlB5Kk\nlde/A0eNdCN6+J/AF0e6EVKbOFMrSZKk1nOmVpIkSa1nqJUkSVLrGWolSZLUeoZaSZIktZ6hVpIk\nSa1nqJUkSVLr/X9RJC+g3Gvn+AAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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\neoZWSZIktZ6hVZIkSa1naJUkSVLrGVolSZLUeoZWSZIktZ6hVZIkSa1naJUkSVLrGVolSZLUeoZW\nSZIktZ6hVZIkSa1naJUkSVLrGVolSZLUeoZWSZIktZ6hVZIkSa1naJUkSVLrGVolSZLUeoZWqeWS\nTPhr+522H/RpSpI0qlTVoOsgqY8kxax1cKBZ4N8CSRuyXXbZhTvuuGPQ1VBj2rRpLF68+AnLk1BV\n6bXP5ImulCRJ0qDdcccd/ue8RZKeuXRUDg+QJElS6xlaJUmS1HqGVkmSJLWeoVWSJEmtZ2iVJElS\n6/npAZIkSRuYCy+8kJtuuolJkyax4447ctxxx/Xdds6cOdx1111suumm7LHHHhx++OEA7L777vz8\n5z9n22235e/+7u94y1vesq6q35OhVZIkbXS232l7lt61dMLKn/qMqSy5c8lq73fddddx2223AXDr\nrbfyl3/5l6tdxgMPPMApp5zC/PnzATjwwAN5zWtew+/8zu88Ydsbb7yROXPmcOmllwLwqle9ile/\n+tU8+clP5gMf+AC/93u/xw477MDkyYOPjIOvgSRJ0jq29K6lTOSXtyydtfqBeOHChdx///0cccQR\nABx88MFrFFovvfRSnve85w3P77vvvsydO5ejjjrqCdtecskl7LrrrsPzU6ZM4fLLL+fggw9mk002\nYeedd17t408UQ6skSVIL3HzzzbzxjW8EYP78+ey1114A3HbbbcyePXvo26KA4W+OIgkzZszgsMMO\nGy7nzjvvZJttthme32abbbj11lt7HnPLLbfk0UcfHZ5fvnw5ixYt4uCDD+bqq6/mt7/9Lffffz97\n7LHHSscYBEOrJEnSgN19993stNNOLFy4kC9+8YssXryYz3/+8wDstttunHrqqWMu67777mOzzTYb\nnt9000158MEHe257xBFHMGfOHAAefPBBbrnlFg444AAADjnkkOHxrfvttx8HHXQQW2+99Rqd33jw\n0wPWM0keT/LPXfOTkvwqyUWrWc7tSbZrpn/QtfzvkyxM8rEk/yfJsatZ7rLV2X6UcuYmmd5MfyvJ\nU9eyvHcMnUuS45NsPx71bMo7KMmBvY4lSdJYXHnllcyYMYO9996b008/nUMPPZQzzzxzjcraaqut\nVvrK2kceeYTtttuu57ZTpkxhzpw5zJ49m7lz57L33nszZcoUgJV6VrfddlvmzZu3RvUZL/a0rn8e\n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\np9/f5GZ5z38THR4gSZI2OkuX3sEEZtam/NWzcOFC7r//fo444giOOOIIvvOd76zRuV166aU873nP\nG57fd9++FggJAAAJt0lEQVR9mTt3bs9tL7nkEnbdddfh+SlTpnD55ZeP2/Lx5PAASZKkFrj55pt5\n4xvfCMD8+fPZa6+9ALjtttuYPXv2Sh/IPzSdhBkzZnDYYYcNl3PnnXeyzTbbDM9vs8023HrrrT2P\nueWWW/Loo48Ozy9fvpxFixaN2/KDDz54bZpkJYZWSZKkAbv77rvZaaedWLhwIV/84hdZvHgxn//8\n5wHYbbfdOPXUU8dc1n333cdmm202PL/pppvy4IMP9tz2iCOOYM6cOQA8+OCD3HLLLRxwwAGccMIJ\n47J8PBlaJUmSBuzKK6/kD/7gD5g0aRKnn346n/3sZznzzDP54Ac/uNplbbXVVtx7773D84888gjb\nb799z22nTJnCnDlzmD17Nttvvz177703U6ZMGbfl48nQKrVez69g1mqaOnXaoKsgSX0tX76cSZMm\nDc8vWrSI3XffHVh5eEC3fsMDnvnMZ3LNNdcMz//6179m+vTpfY+95557sueeewJwyimn8OEPf3hc\nl4+bfk9o+fLla/AvfOJdksbFyL+nMNGfzrJ6f7//6I/+aHj6V7/6Vb3gBS+oBx54YI3O9aGHHqq9\n9957eH7fffetpUuXVlXVT3/603r88ceH1y1evLj22Wefqqq6+eab68gjjxzX5f30ax9G+fSAdNZL\naqMk5e+oJK297oeYhuY7T/pP2BEZ69/vm266iZ/+9KcsW7aMpzzlKSxcuJATTjiBnXfeeY2PfvbZ\nZ7N48WKqit12241jjjkGgOnTp3PmmWey//77A/Doo4/y0Y9+lClTpvCTn/yED33oQ2y77bbjtrxv\n66R3+zTLe95iNLRKLWZolaTxMTIkbb/9Lmv0sVRjNXXqNJYsWTymbc877zze8IY3TFhd2mhNQqtj\nWiVJ0kZnrIFyXegey6r+7GmVWsyeVkkaH/169jQYa9LT6jdiSZIkqfUMrZIkSWo9Q6skSZJaz9Aq\nSZKk1jO0SpIkqfUMrZIkSWo9P6dVkiRt8KZNm9Z8C5baYNq0aau9j5/TKrWYn9MqSdqY+DmtkrQG\n5s2bN+gqbNRs/8Gy/QfL9n8iQ6sk9eE/GoNl+w+W7T9Ytv8TGVolSZLUeoZWSZIktZ4PYkktlsRf\nUEnSRqXfg1iGVkmSJLWewwMkSZLUeoZWSZIktZ6hVVpHkhya5MdJ/l+Sv+yzzT8luTXJdUn2W9W+\nSbZN8t0ktyT5TpKt18W5rI8mqP1PSnJnkgXN69B1cS7rozVo//27lp+ZZGmSG0Zs7/U/RhPU/l7/\nY7Smf3+S7JTk+0luSrIwybu7tt/4rv+q8uXL1wS/6PwH8SfANGAT4DrgOSO2eTXw7Wb6RcCPVrUv\n8DHg/c30XwKnDfpc2/iawPY/CXjPoM+v7a+1af9m/qXAfsANI/bx+h9s+3v9T3D7A9sD+zXTWwK3\nbMx//+1pldaNFwK3VtUdVfUo8FXgD0ds84fAPwNU1ZXA1kmmrmLfPwTOaqbPAg6f2NNYb01U+wP4\nZeartjbtT1X9ALivR7le/2MzUe0PXv9jscbtX1VLquq6ZvmDwCLgGV37bFTXv6FVWjeeAfy8a/5O\nVvzhWdU2o+07taqWAlTVEmDKONZ5QzJR7Q/wJ83tvC9uFLfn1syatP9dPbYZaYrX/5hMVPuD1/9Y\njEv7J9mFTo/3j5pFG931b2iV2mtNejD8DLvxM5b2/wywW1XtBywBPjGxVdIqeP2vW17/60iSLYFv\nACdW1UN9Ntvgr39Dq7Ru3AX8btf8Ts2ykdvs3GOb0fZdMnQLL8n2wC/Hsc4bkglp/6r6VTUDyoDZ\nwAHjWOcNydq0/2iWev2PyYS0v9f/mK1V+yeZTCewfqWqLuzaZqO7/g2t0rpxNbB7kmlJNgWOBi4a\nsc1FwFsAkswA/ru59TPavhcBb22mjwcuRL1MSPs3/1AMOQK4cWJPY721Nu0/JDyx99vrf2wmpP29\n/sdsbdv/S8DNVXV6j33e2kxvHNf/oJ8E8+VrY3kBh9J58vNW4APNsncA/6drm0/Recr0emD6aPs2\ny7cD/qNZ911gm0GfZ1tfE9T+/wzcQOdp4H+lM8Z44Ofaxtdatv+/AL8AfgP8DHhbs9zrf7Dt7/U/\nce2/f7PsJcBjTRtfCywADm3WbXTXv1/jKkmSpNZzeIAkSZJaz9AqSZKk1jO0SpIkqfUMrZIkSWo9\nQ6skSZJaz9AqSZKk1jO0SpIGLsl2Sa5NsiDJ3UnubKavTfKDCTrmXkm+NBFlr4kkc5Ic0Uyf13zX\nvKTG5EFXQJKkqroX2B8gyf8FHqyqif4u+/fR+UD3NpoNvAd496ArIrWFPa2SpLYZ+XWhy5qfByWZ\nl+Rfk/wkyWlJjk1yVZLrk+zabPe0JN9IcmXzevETDtD5Os0ZVXV1M//yrp7e+Um2aJa/tyn/uiQn\nde3/luaY1yY5q1k2Lcl/Ntt+L8lOzfI5SU5PcnlT7yO6yvlUkkVJvgtM6ariXOA149Oc0obBnlZJ\nUtt1f3XjPsBzgP8GbgdmV9ULk7wb+FM6vZOnA5+oqh8m2Rn4DrDniDL3p/P1l0PeC7yrqq5Isjnw\nmySvAp7VlB/goiQvBe4F/ho4sKruS7JNU8YZwJyqOjvJ25r51zXrtq+qlyR5Lp3vjL+gCa/Pqqrn\nJtkBuBk4E6Cq/qcZIvGcqvrxWrWetIEwtEqS1idXV9UvAZL8hE4gBVgIzGymDwGe2wRNgC2TbF5V\nD3eVMw24u2v+cuCTSc4BLqiqu5L8f8Crkiyg0/u7BfCs5ufXq+o+gKr676aMA1kRUr8CfKyr/H9t\ntl2UZKhH9WXAuc3yu5N8f8S53g3sAhhaJQytkqT1y2+6ph/vmn+cFf+mBXhRVT26irKGhyFU1ceS\nfAv4feAHSQ5t1p9aVbNX2in5kz7lVZ/lI+udvls9sX6jlSltVBzTKklqu7GGvCHfBU4c3jnZt8c2\ndwA7dG2zW1XdVFV/B1wDPJtOL+4JXeNbd0zydOD7wOuTbNcs37Yp5ofAm5rpY4HLVnE+lwJvTPKk\nZnjAK0Zst0NTT0nY0ypJar9+vY39lp8IfDrJ9cAkOuHwXSO2uQ7Yo2v+z5K8AngMuAn496p6NMlz\ngCuakQbLgGOr6uYkHwX+K8n/ANcCJ9B50n9OkvcCvwLe1qeeBVBV30xycHO8n9EJvQAkmQw8w/Gs\n0gqp8s6DJGnjk2QO8LmqunLQdRmpeQjstVV14io3ljYSDg+QJG2s/gF4x6Ar0cf/Bj456EpIbWJP\nqyRJklrPnlZJkiS1nqFVkiRJrWdolSRJUusZWiVJktR6hlZJkiS1nqFVkiRJrff/A1PshB3PXwPk\nAAAAAElFTkSuQmCC\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", "plt.rcParams['axes.color_cycle'] = ['g', 'b']\n", "for xlim in [None, (0, second_max*1.2)]:\n", " ax = df_time.ix[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": 48, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Darwin-13.4.0-x86_64-i386-64bit\n" ] } ], "source": [ "import platform\n", "print(platform.platform())" ] }, { "cell_type": "code", "execution_count": 49, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "3.5.0 (default, Sep 23 2015, 04:41:33) \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": 50, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1.10.2\n" ] } ], "source": [ "print(np.__version__)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.5.0" } }, "nbformat": 4, "nbformat_minor": 0 }