{
"metadata": {
"name": "development-steadystate-solver-benchmarks-2"
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# QuTiP development notebook for testing steadystate solvers\n",
"\n",
"Copyright (C) 2013, Paul D. Nation & Robert J. Johansson"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%pylab inline"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n",
"Welcome to pylab, a matplotlib-based Python environment [backend: module://IPython.kernel.zmq.pylab.backend_inline].\n",
"For more information, type 'help(pylab)'.\n"
]
}
],
"prompt_number": 1
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"from qutip import *"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 2
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import time"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 3
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Setup"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"reps = 1"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 4
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"from IPython.display import HTML"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 5
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def show_bm_mat(bm_mat, solvers):\n",
" \n",
" m = bm_mat[bm_mat > 0].min()\n",
" \n",
" html = \"
\"\n",
"\n",
" html += \"| Solver | Elapsed time | Ratio |
\"\n",
" \n",
" for idx, (desc, func) in enumerate(solvers):\n",
" \n",
" if bm_mat[idx] == m:\n",
" html += \"| %s | %.8f | %.2f |
\" % \\\n",
" (desc, bm_mat[idx], bm_mat[idx]/m)\n",
" else:\n",
" html += \"| %s | %.8f | %.2f |
\" % \\\n",
" (desc, bm_mat[idx], bm_mat[idx]/m)\n",
" \n",
" \n",
" html += \"
\"\n",
"\n",
" return HTML(html)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 6
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def benchmark_steadystate_solvers(args, solvers, problem_func):\n",
"\n",
" bm_mat = zeros(len(solvers))\n",
"\n",
" H, c_ops = problem_func(args)\n",
" \n",
" for sol_idx, solver in enumerate(solvers):\n",
" solver_name, solver_func = solver\n",
" try:\n",
" t1 = time.time()\n",
" for r in range(reps):\n",
" rhoss = solver_func(H, c_ops)\n",
" t2 = time.time()\n",
" bm_mat[sol_idx] = (t2 - t1)/reps\n",
" \n",
" except:\n",
" bm_mat[sol_idx] = nan\n",
" \n",
" return bm_mat"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 7
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"solvers = [[\"power use_umfpack=True\", \n",
" lambda H, c_ops: steadystate(H, c_ops, method='power', use_umfpack=True)],\n",
" [\"power use_umfpack=False\", \n",
" lambda H, c_ops: steadystate(H, c_ops, method='power', use_umfpack=False)],\n",
" [\"direct sparse use_umfpack=True\", \n",
" lambda H, c_ops: steadystate(H, c_ops, use_umfpack=True, sparse=True)],\n",
" [\"direct sparse use_umfpack=False\", \n",
" lambda H, c_ops: steadystate(H, c_ops, use_umfpack=False, sparse=True)],\n",
" [\"iterative use_precond=True\", \n",
" lambda H, c_ops: steadystate(H, c_ops, method='iterative', use_precond=True)],\n",
" [\"iterative use_precond=False\", \n",
" lambda H, c_ops: steadystate(H, c_ops, method='iterative', use_precond=False)],\n",
" [\"iterative-bicg use_precond=True\", \n",
" lambda H, c_ops: steadystate(H, c_ops, method='iterative-bicg', use_precond=True)],\n",
" [\"iterative-bicg use_precond=False\", \n",
" lambda H, c_ops: steadystate(H, c_ops, method='iterative-bicg', use_precond=False)],\n",
" [\"direct dense use_umfpack=True\", \n",
" lambda H, c_ops: steadystate(H, c_ops, use_umfpack=True, sparse=False)],\n",
" [\"direct dense use_umfpack=False\", \n",
" lambda H, c_ops: steadystate(H, c_ops, use_umfpack=False, sparse=False)],\n",
" [\"svd_dense\", \n",
" lambda H, c_ops: steadystate(H, c_ops, method='svd')],\n",
" [\"lu\", \n",
" lambda H, c_ops: steadystate(H, c_ops, method='lu')],\n",
" ]"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 8
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"large_solvers = [\n",
" [\"power use_umfpack=True\", \n",
" lambda H, c_ops: steadystate(H, c_ops, method='power', use_umfpack=True)],\n",
" [\"power use_umfpack=False\", \n",
" lambda H, c_ops: steadystate(H, c_ops, method='power', use_umfpack=False)],\n",
" [\"direct sparse use_umfpack=True\", \n",
" lambda H, c_ops: steadystate(H, c_ops, use_umfpack=True, sparse=True)],\n",
" [\"direct sparse use_umfpack=False\", \n",
" lambda H, c_ops: steadystate(H, c_ops, use_umfpack=False, sparse=True)],\n",
" [\"iterative use_precond=True\", \n",
" lambda H, c_ops: steadystate(H, c_ops, method='iterative', use_precond=True)],\n",
" [\"iterative-bicg use_precond=True\", \n",
" lambda H, c_ops: steadystate(H, c_ops, method='iterative-bicg', use_precond=True)],\n",
" ]"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 9
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Test problem 1"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def bm_problem1(N):\n",
"\n",
" a = tensor(destroy(N), identity(2))\n",
" b = tensor(identity(N), destroy(2))\n",
"\n",
" H = a.dag() * a + b.dag() * b + 0.25 * (a + a.dag()) * (b + b.dag())\n",
"\n",
" c_ops = [sqrt(0.1) * a, sqrt(0.075) * a.dag(), sqrt(0.1) * b]\n",
" \n",
" return H, c_ops"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 10
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"bm_mat = benchmark_steadystate_solvers(10, solvers, bm_problem1)\n",
"show_bm_mat(bm_mat, solvers)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"html": [
"| Solver | Elapsed time | Ratio |
| power use_umfpack=True | 0.02930117 | 1.86 |
| power use_umfpack=False | 0.02769184 | 1.76 |
| direct sparse use_umfpack=True | 0.01657772 | 1.05 |
| direct sparse use_umfpack=False | 0.01577711 | 1.00 |
| iterative use_precond=True | 0.01887131 | 1.20 |
| iterative use_precond=False | 0.42715192 | 27.07 |
| iterative-bicg use_precond=True | 0.01824522 | 1.16 |
| iterative-bicg use_precond=False | 0.05967665 | 3.78 |
| direct dense use_umfpack=True | 0.03680706 | 2.33 |
| direct dense use_umfpack=False | 0.03597355 | 2.28 |
| svd_dense | 0.43549585 | 27.60 |
| lu | 0.01581359 | 1.00 |
"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 11,
"text": [
""
]
}
],
"prompt_number": 11
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"bm_mat = benchmark_steadystate_solvers(50, large_solvers, bm_problem1)\n",
"show_bm_mat(bm_mat, large_solvers)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"html": [
"| Solver | Elapsed time | Ratio |
| power use_umfpack=True | 0.30860066 | 2.16 |
| power use_umfpack=False | 0.30906749 | 2.16 |
| direct sparse use_umfpack=True | 0.26223445 | 1.83 |
| direct sparse use_umfpack=False | 0.30435157 | 2.13 |
| iterative use_precond=True | 0.14319158 | 1.00 |
| iterative-bicg use_precond=True | 0.14433670 | 1.01 |
"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 12,
"text": [
""
]
}
],
"prompt_number": 12
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Test problem 2: high temperature harmonic oscillator"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def bm_problem2(N):\n",
" \n",
" a = destroy(N)\n",
" H = a.dag() * a\n",
" nth = N / 4\n",
" gamma = 0.05\n",
" c_ops = [sqrt(gamma * (nth + 1)) * a, sqrt(gamma * nth) * a.dag()]\n",
"\n",
" return H, c_ops"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 13
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"bm_mat = benchmark_steadystate_solvers(50, solvers, bm_problem2)\n",
"show_bm_mat(bm_mat, solvers)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"html": [
"| Solver | Elapsed time | Ratio |
| power use_umfpack=True | 0.03091383 | 2.33 |
| power use_umfpack=False | 0.02793431 | 2.11 |
| direct sparse use_umfpack=True | 0.01574659 | 1.19 |
| direct sparse use_umfpack=False | 0.01326680 | 1.00 |
| iterative use_precond=True | 0.01814747 | 1.37 |
| iterative use_precond=False | 0.08728552 | 6.58 |
| iterative-bicg use_precond=True | 0.01731229 | 1.30 |
| iterative-bicg use_precond=False | 0.03140640 | 2.37 |
| direct dense use_umfpack=True | 3.13456941 | 236.27 |
| direct dense use_umfpack=False | 3.13574004 | 236.36 |
| svd_dense | 71.83850408 | 5414.91 |
| lu | 0.01391077 | 1.05 |
"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 14,
"text": [
""
]
}
],
"prompt_number": 14
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Test problem 3: Coupled oscillators"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def bm_problem3(N):\n",
" \n",
" a = tensor(destroy(N), identity(N))\n",
" b = tensor(identity(N), destroy(N))\n",
" \n",
" H = a.dag() * a + 0.25 * b.dag() * b + 0.05 * a.dag() * a * (b + b.dag()) + 0.1 * (a + a.dag()) \n",
"\n",
" c_ops = [sqrt(0.05) * a, sqrt(0.015) * a.dag(), sqrt(0.1) * b, sqrt(0.075) * b.dag()]\n",
"\n",
" return H, c_ops"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 15
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"bm_mat = benchmark_steadystate_solvers(10, large_solvers, bm_problem3)\n",
"show_bm_mat(bm_mat, large_solvers)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"html": [
"| Solver | Elapsed time | Ratio |
| power use_umfpack=True | 5.09422636 | 7.99 |
| power use_umfpack=False | 35.79435349 | 56.16 |
| direct sparse use_umfpack=True | 5.80584502 | 9.11 |
| direct sparse use_umfpack=False | 30.20628524 | 47.40 |
| iterative use_precond=True | 0.71662021 | 1.12 |
| iterative-bicg use_precond=True | 0.63732290 | 1.00 |
"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 16,
"text": [
""
]
}
],
"prompt_number": 16
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Test problem 4: a two level system "
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def bm_problem4(args=None):\n",
"\n",
" sz = sigmaz() \n",
" sx = sigmax()\n",
" \n",
" H = sz\n",
" c_ops = [sqrt(0.05) * sx]\n",
"\n",
" return H, c_ops"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 17
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"bm_mat = benchmark_steadystate_solvers(None, solvers, bm_problem4)\n",
"show_bm_mat(bm_mat, solvers)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"html": [
"| Solver | Elapsed time | Ratio |
| power use_umfpack=True | 0.01852179 | 3.05 |
| power use_umfpack=False | 0.01754975 | 2.89 |
| direct sparse use_umfpack=True | 0.00707531 | 1.17 |
| direct sparse use_umfpack=False | 0.00687790 | 1.13 |
| iterative use_precond=True | 0.00709677 | 1.17 |
| iterative use_precond=False | 0.00711107 | 1.17 |
| iterative-bicg use_precond=True | 0.01673436 | 2.76 |
| iterative-bicg use_precond=False | 0.00678062 | 1.12 |
| direct dense use_umfpack=True | 0.00611544 | 1.01 |
| direct dense use_umfpack=False | 0.00606394 | 1.00 |
| svd_dense | 0.00769496 | 1.27 |
| lu | 0.00651836 | 1.07 |
"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 18,
"text": [
""
]
}
],
"prompt_number": 18
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Test problem 5: spin chain"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def bm_problem5(N=1):\n",
"\n",
" H = 0\n",
" for m in range(N):\n",
" H += tensor([sigmaz() if n == m else identity(2) for n in range(N)])\n",
"\n",
" for m in range(N-1):\n",
" H += tensor([sigmax() if n in [m,m+1] else identity(2) for n in range(N)]) \n",
" \n",
" c_ops = [sqrt(0.05) * tensor([sigmam() if n == m else identity(2) for n in range(N)])\n",
" for m in range(N)]\n",
" \n",
" return H, c_ops"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 19
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"bm_mat = benchmark_steadystate_solvers(2, solvers, bm_problem5)\n",
"show_bm_mat(bm_mat, solvers)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"html": [
"| Solver | Elapsed time | Ratio |
| power use_umfpack=True | 0.02150130 | 2.35 |
| power use_umfpack=False | 0.02094078 | 2.28 |
| direct sparse use_umfpack=True | 0.01023006 | 1.12 |
| direct sparse use_umfpack=False | 0.00997591 | 1.09 |
| iterative use_precond=True | 0.01020479 | 1.11 |
| iterative use_precond=False | 0.01033449 | 1.13 |
| iterative-bicg use_precond=True | 0.00971484 | 1.06 |
| iterative-bicg use_precond=False | 0.01010346 | 1.10 |
| direct dense use_umfpack=True | 0.00918984 | 1.00 |
| direct dense use_umfpack=False | 0.00916553 | 1.00 |
| svd_dense | 0.01097131 | 1.20 |
| lu | 0.00957203 | 1.04 |
"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 20,
"text": [
""
]
}
],
"prompt_number": 20
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"bm_mat = benchmark_steadystate_solvers(4, solvers, bm_problem5)\n",
"show_bm_mat(bm_mat, solvers)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"html": [
"| Solver | Elapsed time | Ratio |
| power use_umfpack=True | 0.03119278 | 1.59 |
| power use_umfpack=False | 0.03097486 | 1.58 |
| direct sparse use_umfpack=True | 0.01957011 | 1.00 |
| direct sparse use_umfpack=False | 0.01961446 | 1.00 |
| iterative use_precond=True | 0.02565002 | 1.31 |
| iterative use_precond=False | 0.27903152 | 14.26 |
| iterative-bicg use_precond=True | 0.02416730 | 1.23 |
| iterative-bicg use_precond=False | 0.06678843 | 3.41 |
| direct dense use_umfpack=True | 0.02458715 | 1.26 |
| direct dense use_umfpack=False | 0.02418828 | 1.24 |
| svd_dense | 0.16517234 | 8.44 |
| lu | 0.01960063 | 1.00 |
"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 21,
"text": [
""
]
}
],
"prompt_number": 21
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"bm_mat = benchmark_steadystate_solvers(6, large_solvers, bm_problem5)\n",
"show_bm_mat(bm_mat, large_solvers)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stderr",
"text": [
"/usr/local/lib/python3.3/dist-packages/qutip/steadystate.py:314: UserWarning: Preconditioning failed. Continuing without.\n",
" UserWarning)\n"
]
},
{
"html": [
"| Solver | Elapsed time | Ratio |
| power use_umfpack=True | 1.09917188 | 1.08 |
| power use_umfpack=False | 9.79997540 | 9.60 |
| direct sparse use_umfpack=True | 1.02135420 | 1.00 |
| direct sparse use_umfpack=False | 9.18890977 | 9.00 |
| iterative use_precond=True | 13.48026681 | 13.20 |
| iterative-bicg use_precond=True | 2.67135262 | 2.62 |
"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 22,
"text": [
""
]
}
],
"prompt_number": 22
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Software versions"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"from qutip.ipynbtools import version_table\n",
"\n",
"version_table()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"html": [
"| Software | Version |
|---|
| OS | posix [linux] |
| IPython | 1.0.dev |
| Numpy | 1.8.0.dev-c5694c5 |
| QuTiP | 2.3.0.dev-169f358 |
| Cython | 0.19.1 |
| SciPy | 0.13.0.dev-38faf7c |
| Python | 3.3.1 (default, Apr 17 2013, 22:30:32) \n",
"[GCC 4.7.3] |
| matplotlib | 1.4.x |
| Fri Jul 19 14:08:27 2013 JST |
"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 23,
"text": [
""
]
}
],
"prompt_number": 23
}
],
"metadata": {}
}
]
}