{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false }, "outputs": [], "source": [ "from __future__ import print_function\n", "import numpy as np\n", "from quantecon.markov import random_discrete_dp" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Performance Comparison" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Regarding the representation of the transition probability array `Q`:\n", "0. current states $\\times$ actions $\\times$ next states\n", "0. current state-action pairs $\\times$ next states (dense matrix)\n", "0. current state-action pairs $\\times$ next states (sparse matrix)" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def compare_performance(num_states, num_actions, beta, k,\n", " suppress_vi=False, random_state=0):\n", " labels = ['n x m x n', 'n*m x n (dense)', 'n*m x n (sparse)']\n", " flags = [(False, False), (False, True), (True, True)] # (sparse, sa_pair)\n", " ddps = {}\n", " for label, flag in zip(labels, flags):\n", " ddps[label] = \\\n", " random_discrete_dp(num_states, num_actions, beta, k=k,\n", " sparse=flag[0], sa_pair=flag[1],\n", " random_state=random_state)\n", "\n", " if suppress_vi:\n", " methods = ['pi', 'mpi']\n", " else:\n", " methods = ['vi', 'pi', 'mpi']\n", " results = {}\n", " max_iter = 1000\n", " for ddp in ddps.values():\n", " ddp.max_iter = max_iter\n", " k_mpi = 20\n", "\n", " for label in labels:\n", " results[label] = {method: ddps[label].solve(method=method, k=k_mpi)\n", " for method in methods}\n", "\n", " print('(num_states, num_actions) = ({0}, {1})'\n", " .format(num_states, num_actions))\n", " print('Number of possible next states for each (s, a) =', k)\n", " print('beta =', beta)\n", " print('=====')\n", " print('Whether the results by pi agree:',\n", " all([np.array_equal(results[labels[i]]['pi'].sigma,\n", " results[labels[2]]['pi'].sigma)\n", " for i in [0, 1]]))\n", " print('Whether the answer is correct ({0}, {1}, {2}):'.format(*labels))\n", " for method in methods:\n", " if method != 'pi':\n", " print(method.ljust(3) + ':',\n", " [np.array_equal(results[label][method].sigma,\n", " results[label]['pi'].sigma)\n", " for label in labels])\n", " print('Number of iterations ({0}, {1}, {2}):'.format(*labels))\n", " for method in methods:\n", " print(method.ljust(3) + ':',\n", " [results[label][method].num_iter for label in labels])\n", " print('=====')\n", "\n", " print('Speed comparison ({0}, {1}, {2}):'.format(*labels))\n", " for method in methods:\n", " print('***', method, '***')\n", " for label in labels:\n", " global ddps, label, method\n", " %timeit ddps[label].solve(method=method)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [], "source": [ "seed = 1234 # Set random seed" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(num_states, num_actions) = (100, 20)\n", "Number of possible next states for each (s, a) = 3\n", "beta = 0.95\n", "=====\n", "Whether the results by pi agree: True\n", "Whether the answer is correct (n x m x n, n*m x n (dense), n*m x n (sparse)):\n", "vi : [True, True, True]\n", "mpi: [True, True, True]\n", "Number of iterations (n x m x n, n*m x n (dense), n*m x n (sparse)):\n", "vi : [219, 219, 219]\n", "pi : [4, 4, 4]\n", "mpi: [6, 6, 6]\n", "=====\n", "Speed comparison (n x m x n, n*m x n (dense), n*m x n (sparse)):\n", "*** vi ***\n", "10 loops, best of 3: 32.1 ms per loop\n", "100 loops, best of 3: 16.1 ms per loop\n", "100 loops, best of 3: 9.34 ms per loop\n", "*** pi ***\n", "100 loops, best of 3: 1.94 ms per loop\n", "1000 loops, best of 3: 1.38 ms per loop\n", "100 loops, best of 3: 3.82 ms per loop\n", "*** mpi ***\n", "1000 loops, best of 3: 2.08 ms per loop\n", "1000 loops, best of 3: 1.69 ms per loop\n", "100 loops, best of 3: 3.74 ms per loop\n" ] } ], "source": [ "compare_performance(num_states=100, num_actions=20, beta=0.95, k=3,\n", " random_state=seed)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(num_states, num_actions) = (500, 20)\n", "Number of possible next states for each (s, a) = 3\n", "beta = 0.95\n", "=====\n", "Whether the results by pi agree: True\n", "Whether the answer is correct (n x m x n, n*m x n (dense), n*m x n (sparse)):\n", "vi : [True, True, True]\n", "mpi: [True, True, True]\n", "Number of iterations (n x m x n, n*m x n (dense), n*m x n (sparse)):\n", "vi : [220, 220, 220]\n", "pi : [5, 5, 5]\n", "mpi: [7, 7, 7]\n", "=====\n", "Speed comparison (n x m x n, n*m x n (dense), n*m x n (sparse)):\n", "*** vi ***\n", "1 loops, best of 3: 937 ms per loop\n", "1 loops, best of 3: 477 ms per loop\n", "10 loops, best of 3: 21.3 ms per loop\n", "*** pi ***\n", "10 loops, best of 3: 46.2 ms per loop\n", "10 loops, best of 3: 32.4 ms per loop\n", "10 loops, best of 3: 27.2 ms per loop\n", "*** mpi ***\n", "10 loops, best of 3: 46.8 ms per loop\n", "10 loops, best of 3: 29.4 ms per loop\n", "100 loops, best of 3: 5.33 ms per loop\n" ] } ], "source": [ "compare_performance(num_states=500, num_actions=20, beta=0.95, k=3,\n", " random_state=seed)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(num_states, num_actions) = (1000, 20)\n", "Number of possible next states for each (s, a) = 3\n", "beta = 0.95\n", "=====\n", "Whether the results by pi agree: True\n", "Whether the answer is correct (n x m x n, n*m x n (dense), n*m x n (sparse)):\n", "vi : [True, True, True]\n", "mpi: [True, True, True]\n", "Number of iterations (n x m x n, n*m x n (dense), n*m x n (sparse)):\n", "vi : [219, 219, 219]\n", "pi : [5, 5, 5]\n", "mpi: [7, 7, 7]\n", "=====\n", "Speed comparison (n x m x n, n*m x n (dense), n*m x n (sparse)):\n", "*** vi ***\n", "1 loops, best of 3: 3.1 s per loop\n", "1 loops, best of 3: 1.78 s per loop\n", "10 loops, best of 3: 37.9 ms per loop\n", "*** pi ***\n", "1 loops, best of 3: 262 ms per loop\n", "1 loops, best of 3: 214 ms per loop\n", "10 loops, best of 3: 143 ms per loop\n", "*** mpi ***\n", "10 loops, best of 3: 146 ms per loop\n", "10 loops, best of 3: 105 ms per loop\n", "100 loops, best of 3: 6.58 ms per loop\n" ] } ], "source": [ "compare_performance(num_states=1000, num_actions=20, beta=0.95, k=3,\n", " random_state=seed)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(num_states, num_actions) = (1000, 50)\n", "Number of possible next states for each (s, a) = 3\n", "beta = 0.95\n", "=====\n", "Whether the results by pi agree: True\n", "Whether the answer is correct (n x m x n, n*m x n (dense), n*m x n (sparse)):\n", "vi : [True, True, True]\n", "mpi: [True, True, True]\n", "Number of iterations (n x m x n, n*m x n (dense), n*m x n (sparse)):\n", "vi : [223, 223, 223]\n", "pi : [5, 5, 5]\n", "mpi: [6, 6, 6]\n", "=====\n", "Speed comparison (n x m x n, n*m x n (dense), n*m x n (sparse)):\n", "*** vi ***\n", "1 loops, best of 3: 7.81 s per loop\n", "1 loops, best of 3: 4.54 s per loop\n", "10 loops, best of 3: 76.1 ms per loop\n", "*** pi ***\n", "1 loops, best of 3: 353 ms per loop\n", "1 loops, best of 3: 279 ms per loop\n", "10 loops, best of 3: 149 ms per loop\n", "*** mpi ***\n", "1 loops, best of 3: 261 ms per loop\n", "10 loops, best of 3: 162 ms per loop\n", "100 loops, best of 3: 7.22 ms per loop\n" ] } ], "source": [ "compare_performance(num_states=1000, num_actions=50, beta=0.95, k=3,\n", " random_state=seed)" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(num_states, num_actions) = (500, 20)\n", "Number of possible next states for each (s, a) = 100\n", "beta = 0.95\n", "=====\n", "Whether the results by pi agree: True\n", "Whether the answer is correct (n x m x n, n*m x n (dense), n*m x n (sparse)):\n", "vi : [True, True, True]\n", "mpi: [True, True, True]\n", "Number of iterations (n x m x n, n*m x n (dense), n*m x n (sparse)):\n", "vi : [218, 218, 218]\n", "pi : [3, 3, 3]\n", "mpi: [4, 4, 4]\n", "=====\n", "Speed comparison (n x m x n, n*m x n (dense), n*m x n (sparse)):\n", "*** vi ***\n", "1 loops, best of 3: 918 ms per loop\n", "1 loops, best of 3: 461 ms per loop\n", "1 loops, best of 3: 218 ms per loop\n", "*** pi ***\n", "10 loops, best of 3: 32 ms per loop\n", "10 loops, best of 3: 22.8 ms per loop\n", "10 loops, best of 3: 74.2 ms per loop\n", "*** mpi ***\n", "10 loops, best of 3: 26.2 ms per loop\n", "100 loops, best of 3: 16.9 ms per loop\n", "100 loops, best of 3: 10.8 ms per loop\n" ] } ], "source": [ "compare_performance(num_states=500, num_actions=20, beta=0.95, k=100,\n", " random_state=seed)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(num_states, num_actions) = (500, 20)\n", "Number of possible next states for each (s, a) = 50\n", "beta = 0.95\n", "=====\n", "Whether the results by pi agree: True\n", "Whether the answer is correct (n x m x n, n*m x n (dense), n*m x n (sparse)):\n", "vi : [True, True, True]\n", "mpi: [True, True, True]\n", "Number of iterations (n x m x n, n*m x n (dense), n*m x n (sparse)):\n", "vi : [218, 218, 218]\n", "pi : [2, 2, 2]\n", "mpi: [4, 4, 4]\n", "=====\n", "Speed comparison (n x m x n, n*m x n (dense), n*m x n (sparse)):\n", "*** vi ***\n", "1 loops, best of 3: 920 ms per loop\n", "1 loops, best of 3: 458 ms per loop\n", "10 loops, best of 3: 115 ms per loop\n", "*** pi ***\n", "10 loops, best of 3: 24.5 ms per loop\n", "100 loops, best of 3: 17.9 ms per loop\n", "10 loops, best of 3: 45.8 ms per loop\n", "*** mpi ***\n", "10 loops, best of 3: 25.3 ms per loop\n", "100 loops, best of 3: 15.4 ms per loop\n", "100 loops, best of 3: 6.81 ms per loop\n" ] } ], "source": [ "compare_performance(num_states=500, num_actions=20, beta=0.95, k=50,\n", " random_state=seed)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(num_states, num_actions) = (500, 20)\n", "Number of possible next states for each (s, a) = 500\n", "beta = 0.95\n", "=====\n", "Whether the results by pi agree: True\n", "Whether the answer is correct (n x m x n, n*m x n (dense), n*m x n (sparse)):\n", "vi : [True, True, True]\n", "mpi: [True, True, True]\n", "Number of iterations (n x m x n, n*m x n (dense), n*m x n (sparse)):\n", "vi : [218, 218, 218]\n", "pi : [1, 1, 1]\n", "mpi: [3, 3, 3]\n", "=====\n", "Speed comparison (n x m x n, n*m x n (dense), n*m x n (sparse)):\n", "*** vi ***\n", "1 loops, best of 3: 925 ms per loop\n", "1 loops, best of 3: 488 ms per loop\n", "1 loops, best of 3: 1.06 s per loop\n", "*** pi ***\n", "100 loops, best of 3: 13.8 ms per loop\n", "100 loops, best of 3: 9.41 ms per loop\n", "10 loops, best of 3: 54.7 ms per loop\n", "*** mpi ***\n", "100 loops, best of 3: 19.2 ms per loop\n", "100 loops, best of 3: 11.5 ms per loop\n", "10 loops, best of 3: 28.5 ms per loop\n" ] } ], "source": [ "compare_performance(num_states=500, num_actions=20, beta=0.95, k=500,\n", " random_state=seed)" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(num_states, num_actions) = (1000, 100)\n", "Number of possible next states for each (s, a) = 1\n", "beta = 0.95\n", "=====\n", "Whether the results by pi agree: True\n", "Whether the answer is correct (n x m x n, n*m x n (dense), n*m x n (sparse)):\n", "vi : [True, True, True]\n", "mpi: [True, True, True]\n", "Number of iterations (n x m x n, n*m x n (dense), n*m x n (sparse)):\n", "vi : [230, 230, 230]\n", "pi : [11, 11, 11]\n", "mpi: [15, 15, 15]\n", "=====\n", "Speed comparison (n x m x n, n*m x n (dense), n*m x n (sparse)):\n", "*** vi ***\n", "1 loops, best of 3: 16.2 s per loop\n", "1 loops, best of 3: 9.77 s per loop\n", "10 loops, best of 3: 116 ms per loop\n", "*** pi ***\n", "1 loops, best of 3: 1.23 s per loop\n", "1 loops, best of 3: 853 ms per loop\n", "100 loops, best of 3: 19.7 ms per loop\n", "*** mpi ***\n", "1 loops, best of 3: 1.25 s per loop\n", "1 loops, best of 3: 799 ms per loop\n", "10 loops, best of 3: 21.7 ms per loop\n" ] } ], "source": [ "compare_performance(num_states=1000, num_actions=100, beta=0.95, k=1,\n", " random_state=seed)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(num_states, num_actions) = (1000, 200)\n", "Number of possible next states for each (s, a) = 1\n", "beta = 0.95\n", "=====\n", "Whether the results by pi agree: True\n", "Whether the answer is correct (n x m x n, n*m x n (dense), n*m x n (sparse)):\n", "mpi: [True, True, True]\n", "Number of iterations (n x m x n, n*m x n (dense), n*m x n (sparse)):\n", "pi : [8, 8, 8]\n", "mpi: [16, 16, 16]\n", "=====\n", "Speed comparison (n x m x n, n*m x n (dense), n*m x n (sparse)):\n", "*** pi ***\n", "1 loops, best of 3: 1.52 s per loop\n", "1 loops, best of 3: 1 s per loop\n", "10 loops, best of 3: 20.5 ms per loop\n", "*** mpi ***\n", "1 loops, best of 3: 2.3 s per loop\n", "1 loops, best of 3: 1.43 s per loop\n", "10 loops, best of 3: 33 ms per loop\n" ] } ], "source": [ "compare_performance(num_states=1000, num_actions=200, beta=0.95, k=1,\n", " suppress_vi=True, random_state=seed)" ] }, { "cell_type": "code", "execution_count": 13, "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": 14, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2.7.10 (default, Jun 10 2015, 19:43:32) \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": 15, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1.10.1\n" ] } ], "source": [ "print(np.__version__)" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.16.1\n" ] } ], "source": [ "import scipy\n", "print(scipy.__version__)" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.22.1\n" ] } ], "source": [ "import numba\n", "print(numba.__version__)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 2", "language": "python", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.10" } }, "nbformat": 4, "nbformat_minor": 0 }