Copyright (C) 2013, Paul D. Nation & Robert J. Johansson
%pylab inline
Populating the interactive namespace from numpy and matplotlib
from qutip import *
import time
reps = 10
from IPython.display import HTML
def show_bm_mat(bm_mat, solvers):
m = bm_mat[bm_mat > 0].min()
html = "<table>"
html += "<tr><td><b>Solver</b></td><td><b>Elapsed time</b></td><td><b>Ratio</b></td></tr>"
for idx, (desc, func) in enumerate(solvers):
if bm_mat[idx] == m:
html += "<tr><td><b>%s</b></td><td><b>%.8f</b></td><td><b>%.2f</b></td></tr>" % \
(desc, bm_mat[idx], bm_mat[idx]/m)
else:
html += "<tr><td>%s</td><td>%.8f</td><td>%.2f</td></tr>" % \
(desc, bm_mat[idx], bm_mat[idx]/m)
html += "</table>"
return HTML(html)
def benchmark_steadystate_solvers(args, solvers, problem_func):
bm_mat = zeros(len(solvers))
H, c_ops = problem_func(args)
for sol_idx, solver in enumerate(solvers):
solver_name, solver_func = solver
try:
t1 = time.time()
for r in range(reps):
rhoss = solver_func(H, c_ops)
t2 = time.time()
bm_mat[sol_idx] = (t2 - t1)/reps
except Exception as e:
bm_mat[sol_idx] = nan
print("Failure in %s: %s" % (solver_name, str(e)))
return bm_mat
solvers = [
["power use_umfpack=True",
lambda H, c_ops: steadystate(H, c_ops, method='power', use_umfpack=True)],
["power use_umfpack=False",
lambda H, c_ops: steadystate(H, c_ops, method='power', use_umfpack=False)],
["direct sparse use_umfpack=True",
lambda H, c_ops: steadystate(H, c_ops, method='direct', use_umfpack=True, sparse=True)],
["direct sparse use_umfpack=False",
lambda H, c_ops: steadystate(H, c_ops, method='direct', use_umfpack=False, sparse=True)],
["direct dense use_umfpack=True",
lambda H, c_ops: steadystate(H, c_ops, method='direct', use_umfpack=True, sparse=False)],
["direct dense use_umfpack=False",
lambda H, c_ops: steadystate(H, c_ops, method='direct', use_umfpack=False, sparse=False)],
["iterative use_precond=True, use_rcm=True, sym=True",
lambda H, c_ops: steadystate(H, c_ops, method='iterative', use_precond=True, use_rcm=True, sym=True)],
["iterative use_precond=True, use_rcm=False, sym=True",
lambda H, c_ops: steadystate(H, c_ops, method='iterative', use_precond=True, use_rcm=False, sym=True)],
["iterative use_precond=False, use_rcm=True, sym=True",
lambda H, c_ops: steadystate(H, c_ops, method='iterative', use_precond=False, use_rcm=True, sym=True)],
["iterative use_precond=False, use_rcm=False, sym=True",
lambda H, c_ops: steadystate(H, c_ops, method='iterative', use_precond=False, use_rcm=False, sym=True)],
["iterative use_precond=True, use_rcm=True, sym=False",
lambda H, c_ops: steadystate(H, c_ops, method='iterative', use_precond=True, use_rcm=True, sym=False)],
["iterative use_precond=True, use_rcm=False, sym=False",
lambda H, c_ops: steadystate(H, c_ops, method='iterative', use_precond=True, use_rcm=False, sym=False)],
["iterative use_precond=False, use_rcm=True, sym=False",
lambda H, c_ops: steadystate(H, c_ops, method='iterative', use_precond=False, use_rcm=True, sym=False)],
["iterative use_precond=False, use_rcm=False, sym=False",
lambda H, c_ops: steadystate(H, c_ops, method='iterative', use_precond=False, use_rcm=False, sym=False)],
["iterative-bicg use_precond=True, use_rcm=True, sym=True",
lambda H, c_ops: steadystate(H, c_ops, method='iterative-bicg', use_precond=True, use_rcm=True, sym=True)],
["iterative-bicg use_precond=False, use_rcm=False, sym=True",
lambda H, c_ops: steadystate(H, c_ops, method='iterative-bicg', use_precond=False, use_rcm=False, sym=True)],
["iterative-bicg use_precond=True, use_rcm=True, sym=True",
lambda H, c_ops: steadystate(H, c_ops, method='iterative-bicg', use_precond=True, use_rcm=True, sym=True)],
["iterative-bicg use_precond=False, use_rcm=False, sym=True",
lambda H, c_ops: steadystate(H, c_ops, method='iterative-bicg', use_precond=False, use_rcm=False, sym=True)],
["iterative-bicg use_precond=True, use_rcm=True, sym=False",
lambda H, c_ops: steadystate(H, c_ops, method='iterative-bicg', use_precond=True, use_rcm=True, sym=False)],
["iterative-bicg use_precond=True, use_rcm=False, sym=False",
lambda H, c_ops: steadystate(H, c_ops, method='iterative-bicg', use_precond=True, use_rcm=False, sym=False)],
["iterative-bicg use_precond=False, use_rcm=True, sym=False",
lambda H, c_ops: steadystate(H, c_ops, method='iterative-bicg', use_precond=False, use_rcm=True, sym=False)],
["iterative-bicg use_precond=False, use_rcm=False, sym=False",
lambda H, c_ops: steadystate(H, c_ops, method='iterative-bicg', use_precond=False, use_rcm=False, sym=False)],
#["svd_dense",
# lambda H, c_ops: steadystate(H, c_ops, method='svd')],
["lu",
lambda H, c_ops: steadystate(H, c_ops, method='lu')],
]
large_solvers = [
["power use_umfpack=True",
lambda H, c_ops: steadystate(H, c_ops, method='power', use_umfpack=True)],
["power use_umfpack=False",
lambda H, c_ops: steadystate(H, c_ops, method='power', use_umfpack=False)],
["direct sparse use_umfpack=True",
lambda H, c_ops: steadystate(H, c_ops, use_umfpack=True, sparse=True)],
["direct sparse use_umfpack=False",
lambda H, c_ops: steadystate(H, c_ops, use_umfpack=False, sparse=True)],
["iterative use_precond=True, use_rcm=True, sym=False",
lambda H, c_ops: steadystate(H, c_ops, method='iterative', use_precond=True, use_rcm=True, sym=False)],
["iterative use_precond=True, use_rcm=False, sym=False",
lambda H, c_ops: steadystate(H, c_ops, method='iterative', use_precond=True, use_rcm=False, sym=False)],
["iterative-bicg use_precond=True, use_rcm=True, sym=False",
lambda H, c_ops: steadystate(H, c_ops, method='iterative-bicg', use_precond=True, use_rcm=True, sym=False)],
["iterative-bicg use_precond=True, use_rcm=False, sym=False",
lambda H, c_ops: steadystate(H, c_ops, method='iterative-bicg', use_precond=True, use_rcm=False, sym=False)],
]
def bm_problem1(N):
a = tensor(destroy(N), identity(2))
b = tensor(identity(N), destroy(2))
H = a.dag() * a + b.dag() * b + 0.25 * (a + a.dag()) * (b + b.dag())
c_ops = [sqrt(0.1) * a, sqrt(0.075) * a.dag(), sqrt(0.1) * b]
return H, c_ops
bm_mat = benchmark_steadystate_solvers(10, solvers, bm_problem1)
show_bm_mat(bm_mat, solvers)
Failure in iterative use_precond=False, use_rcm=True, sym=True: Steadystate solver did not reach tolerance after 1000 steps. Failure in iterative use_precond=False, use_rcm=False, sym=True: Steadystate solver did not reach tolerance after 1000 steps. Failure in iterative use_precond=False, use_rcm=True, sym=False: Steadystate solver did not reach tolerance after 1000 steps. Failure in iterative use_precond=False, use_rcm=False, sym=False: Steadystate solver did not reach tolerance after 1000 steps.
/home/rob/py-envs/py3-stable/lib/python3.3/site-packages/qutip/steadystate.py:153: UserWarning: The use of use_umfpack is deprecated. warnings.warn("The use of use_umfpack is deprecated.") -c:3: RuntimeWarning: invalid value encountered in greater
Solver | Elapsed time | Ratio |
power use_umfpack=True | 0.02337635 | 1.47 |
power use_umfpack=False | 0.02320838 | 1.46 |
direct sparse use_umfpack=True | 0.01801844 | 1.14 |
direct sparse use_umfpack=False | 0.01740201 | 1.10 |
direct dense use_umfpack=True | 0.04866381 | 3.07 |
direct dense use_umfpack=False | 0.04866440 | 3.07 |
iterative use_precond=True, use_rcm=True, sym=True | 0.02051804 | 1.29 |
iterative use_precond=True, use_rcm=False, sym=True | 0.01893902 | 1.19 |
iterative use_precond=False, use_rcm=True, sym=True | nan | nan |
iterative use_precond=False, use_rcm=False, sym=True | nan | nan |
iterative use_precond=True, use_rcm=True, sym=False | 0.01817827 | 1.15 |
iterative use_precond=True, use_rcm=False, sym=False | 0.01661460 | 1.05 |
iterative use_precond=False, use_rcm=True, sym=False | nan | nan |
iterative use_precond=False, use_rcm=False, sym=False | nan | nan |
iterative-bicg use_precond=True, use_rcm=True, sym=True | 0.01868496 | 1.18 |
iterative-bicg use_precond=False, use_rcm=False, sym=True | 0.06821716 | 4.30 |
iterative-bicg use_precond=True, use_rcm=True, sym=True | 0.01880364 | 1.18 |
iterative-bicg use_precond=False, use_rcm=False, sym=True | 0.06844871 | 4.31 |
iterative-bicg use_precond=True, use_rcm=True, sym=False | 0.01848016 | 1.16 |
iterative-bicg use_precond=True, use_rcm=False, sym=False | 0.01699817 | 1.07 |
iterative-bicg use_precond=False, use_rcm=True, sym=False | 0.06557376 | 4.13 |
iterative-bicg use_precond=False, use_rcm=False, sym=False | 0.06788254 | 4.28 |
lu | 0.01587019 | 1.00 |
bm_mat = benchmark_steadystate_solvers(50, large_solvers, bm_problem1)
show_bm_mat(bm_mat, large_solvers)
Solver | Elapsed time | Ratio |
power use_umfpack=True | 0.27807622 | 1.19 |
power use_umfpack=False | 0.28087587 | 1.20 |
direct sparse use_umfpack=True | 0.23442681 | 1.00 |
direct sparse use_umfpack=False | 0.28316166 | 1.21 |
iterative use_precond=True, use_rcm=True, sym=False | 0.27145686 | 1.16 |
iterative use_precond=True, use_rcm=False, sym=False | 0.27361963 | 1.17 |
iterative-bicg use_precond=True, use_rcm=True, sym=False | 0.27396398 | 1.17 |
iterative-bicg use_precond=True, use_rcm=False, sym=False | 0.29887297 | 1.27 |
def bm_problem2(N):
a = destroy(N)
H = a.dag() * a
nth = N / 4
gamma = 0.05
c_ops = [sqrt(gamma * (nth + 1)) * a, sqrt(gamma * nth) * a.dag()]
return H, c_ops
bm_mat = benchmark_steadystate_solvers(50, solvers, bm_problem2)
show_bm_mat(bm_mat, solvers)
Failure in iterative-bicg use_precond=True, use_rcm=False, sym=False: Steadystate solver failed with fatal error: -10.
Solver | Elapsed time | Ratio |
power use_umfpack=True | 0.02198510 | 1.60 |
power use_umfpack=False | 0.02195816 | 1.60 |
direct sparse use_umfpack=True | 0.01739521 | 1.27 |
direct sparse use_umfpack=False | 0.01502705 | 1.09 |
direct dense use_umfpack=True | 5.38591220 | 391.95 |
direct dense use_umfpack=False | 5.56329439 | 404.86 |
iterative use_precond=True, use_rcm=True, sym=True | 0.01940596 | 1.41 |
iterative use_precond=True, use_rcm=False, sym=True | 0.01877887 | 1.37 |
iterative use_precond=False, use_rcm=True, sym=True | 0.85532901 | 62.25 |
iterative use_precond=False, use_rcm=False, sym=True | 0.90501690 | 65.86 |
iterative use_precond=True, use_rcm=True, sym=False | 0.01919260 | 1.40 |
iterative use_precond=True, use_rcm=False, sym=False | 0.01824219 | 1.33 |
iterative use_precond=False, use_rcm=True, sym=False | 0.82320507 | 59.91 |
iterative use_precond=False, use_rcm=False, sym=False | 0.89947019 | 65.46 |
iterative-bicg use_precond=True, use_rcm=True, sym=True | 0.01872413 | 1.36 |
iterative-bicg use_precond=False, use_rcm=False, sym=True | 0.03652155 | 2.66 |
iterative-bicg use_precond=True, use_rcm=True, sym=True | 0.01884017 | 1.37 |
iterative-bicg use_precond=False, use_rcm=False, sym=True | 0.03594759 | 2.62 |
iterative-bicg use_precond=True, use_rcm=True, sym=False | 0.01916583 | 1.39 |
iterative-bicg use_precond=True, use_rcm=False, sym=False | nan | nan |
iterative-bicg use_precond=False, use_rcm=True, sym=False | 0.03907797 | 2.84 |
iterative-bicg use_precond=False, use_rcm=False, sym=False | 0.03581498 | 2.61 |
lu | 0.01374128 | 1.00 |
def bm_problem3(N):
a = tensor(destroy(N), identity(N))
b = tensor(identity(N), destroy(N))
H = a.dag() * a + 0.25 * b.dag() * b + 0.05 * a.dag() * a * (b + b.dag()) + 0.1 * (a + a.dag())
c_ops = [sqrt(0.05) * a, sqrt(0.015) * a.dag(), sqrt(0.1) * b, sqrt(0.075) * b.dag()]
return H, c_ops
bm_mat = benchmark_steadystate_solvers(10, large_solvers, bm_problem3)
show_bm_mat(bm_mat, large_solvers)
Solver | Elapsed time | Ratio |
power use_umfpack=True | 33.75028317 | 10.41 |
power use_umfpack=False | 34.65209894 | 10.68 |
direct sparse use_umfpack=True | 8.38044708 | 2.58 |
direct sparse use_umfpack=False | 27.64443343 | 8.52 |
iterative use_precond=True, use_rcm=True, sym=False | 3.24328792 | 1.00 |
iterative use_precond=True, use_rcm=False, sym=False | 3.47413125 | 1.07 |
iterative-bicg use_precond=True, use_rcm=True, sym=False | 4.31313200 | 1.33 |
iterative-bicg use_precond=True, use_rcm=False, sym=False | 3.44422872 | 1.06 |
def bm_problem4(args=None):
sz = sigmaz()
sx = sigmax()
H = sz
c_ops = [sqrt(0.05) * sx]
return H, c_ops
bm_mat = benchmark_steadystate_solvers(None, solvers, bm_problem4)
show_bm_mat(bm_mat, solvers)
Solver | Elapsed time | Ratio |
power use_umfpack=True | 0.01118724 | 1.95 |
power use_umfpack=False | 0.01090584 | 1.90 |
direct sparse use_umfpack=True | 0.00697067 | 1.21 |
direct sparse use_umfpack=False | 0.00657489 | 1.14 |
direct dense use_umfpack=True | 0.00577335 | 1.00 |
direct dense use_umfpack=False | 0.00575178 | 1.00 |
iterative use_precond=True, use_rcm=True, sym=True | 0.00739422 | 1.29 |
iterative use_precond=True, use_rcm=False, sym=True | 0.00644894 | 1.12 |
iterative use_precond=False, use_rcm=True, sym=True | 0.00735872 | 1.28 |
iterative use_precond=False, use_rcm=False, sym=True | 0.00638795 | 1.11 |
iterative use_precond=True, use_rcm=True, sym=False | 0.00745142 | 1.30 |
iterative use_precond=True, use_rcm=False, sym=False | 0.00646114 | 1.12 |
iterative use_precond=False, use_rcm=True, sym=False | 0.00748370 | 1.30 |
iterative use_precond=False, use_rcm=False, sym=False | 0.00631652 | 1.10 |
iterative-bicg use_precond=True, use_rcm=True, sym=True | 0.00740299 | 1.29 |
iterative-bicg use_precond=False, use_rcm=False, sym=True | 0.00633924 | 1.10 |
iterative-bicg use_precond=True, use_rcm=True, sym=True | 0.00731163 | 1.27 |
iterative-bicg use_precond=False, use_rcm=False, sym=True | 0.00634141 | 1.10 |
iterative-bicg use_precond=True, use_rcm=True, sym=False | 0.00732563 | 1.27 |
iterative-bicg use_precond=True, use_rcm=False, sym=False | 0.00647802 | 1.13 |
iterative-bicg use_precond=False, use_rcm=True, sym=False | 0.00735517 | 1.28 |
iterative-bicg use_precond=False, use_rcm=False, sym=False | 0.00637131 | 1.11 |
lu | 0.00636835 | 1.11 |
def bm_problem5(N=1):
H = 0
for m in range(N):
H += tensor([sigmaz() if n == m else identity(2) for n in range(N)])
for m in range(N-1):
H += tensor([sigmax() if n in [m,m+1] else identity(2) for n in range(N)])
c_ops = [sqrt(0.05) * tensor([sigmam() if n == m else identity(2) for n in range(N)])
for m in range(N)]
return H, c_ops
bm_mat = benchmark_steadystate_solvers(2, solvers, bm_problem5)
show_bm_mat(bm_mat, solvers)
Solver | Elapsed time | Ratio |
power use_umfpack=True | 0.01427205 | 1.59 |
power use_umfpack=False | 0.01437883 | 1.60 |
direct sparse use_umfpack=True | 0.01016231 | 1.13 |
direct sparse use_umfpack=False | 0.00989394 | 1.10 |
direct dense use_umfpack=True | 0.00903437 | 1.00 |
direct dense use_umfpack=False | 0.00900269 | 1.00 |
iterative use_precond=True, use_rcm=True, sym=True | 0.01079981 | 1.20 |
iterative use_precond=True, use_rcm=False, sym=True | 0.00970068 | 1.08 |
iterative use_precond=False, use_rcm=True, sym=True | 0.01065261 | 1.18 |
iterative use_precond=False, use_rcm=False, sym=True | 0.00960047 | 1.07 |
iterative use_precond=True, use_rcm=True, sym=False | 0.01077218 | 1.20 |
iterative use_precond=True, use_rcm=False, sym=False | 0.00982673 | 1.09 |
iterative use_precond=False, use_rcm=True, sym=False | 0.01066728 | 1.18 |
iterative use_precond=False, use_rcm=False, sym=False | 0.00975940 | 1.08 |
iterative-bicg use_precond=True, use_rcm=True, sym=True | 0.01067920 | 1.19 |
iterative-bicg use_precond=False, use_rcm=False, sym=True | 0.00998452 | 1.11 |
iterative-bicg use_precond=True, use_rcm=True, sym=True | 0.01066823 | 1.19 |
iterative-bicg use_precond=False, use_rcm=False, sym=True | 0.01001103 | 1.11 |
iterative-bicg use_precond=True, use_rcm=True, sym=False | 0.01083741 | 1.20 |
iterative-bicg use_precond=True, use_rcm=False, sym=False | 0.00956621 | 1.06 |
iterative-bicg use_precond=False, use_rcm=True, sym=False | 0.01108155 | 1.23 |
iterative-bicg use_precond=False, use_rcm=False, sym=False | 0.00998340 | 1.11 |
lu | 0.00949795 | 1.06 |
bm_mat = benchmark_steadystate_solvers(4, solvers, bm_problem5)
show_bm_mat(bm_mat, solvers)
Failure in iterative use_precond=False, use_rcm=True, sym=True: Steadystate solver did not reach tolerance after 1000 steps. Failure in iterative use_precond=False, use_rcm=False, sym=True: Steadystate solver did not reach tolerance after 1000 steps. Failure in iterative use_precond=False, use_rcm=True, sym=False: Steadystate solver did not reach tolerance after 1000 steps. Failure in iterative use_precond=False, use_rcm=False, sym=False: Steadystate solver did not reach tolerance after 1000 steps.
Solver | Elapsed time | Ratio |
power use_umfpack=True | 0.02471032 | 1.25 |
power use_umfpack=False | 0.02463510 | 1.25 |
direct sparse use_umfpack=True | 0.01991639 | 1.01 |
direct sparse use_umfpack=False | 0.01971462 | 1.00 |
direct dense use_umfpack=True | 0.02616692 | 1.33 |
direct dense use_umfpack=False | 0.02603197 | 1.32 |
iterative use_precond=True, use_rcm=True, sym=True | 0.02279491 | 1.16 |
iterative use_precond=True, use_rcm=False, sym=True | 0.02091999 | 1.06 |
iterative use_precond=False, use_rcm=True, sym=True | nan | nan |
iterative use_precond=False, use_rcm=False, sym=True | nan | nan |
iterative use_precond=True, use_rcm=True, sym=False | 0.02344491 | 1.19 |
iterative use_precond=True, use_rcm=False, sym=False | 0.02175648 | 1.10 |
iterative use_precond=False, use_rcm=True, sym=False | nan | nan |
iterative use_precond=False, use_rcm=False, sym=False | nan | nan |
iterative-bicg use_precond=True, use_rcm=True, sym=True | 0.02228684 | 1.13 |
iterative-bicg use_precond=False, use_rcm=False, sym=True | 0.07718029 | 3.92 |
iterative-bicg use_precond=True, use_rcm=True, sym=True | 0.02243965 | 1.14 |
iterative-bicg use_precond=False, use_rcm=False, sym=True | 0.07755005 | 3.94 |
iterative-bicg use_precond=True, use_rcm=True, sym=False | 0.02243128 | 1.14 |
iterative-bicg use_precond=True, use_rcm=False, sym=False | 0.02093019 | 1.06 |
iterative-bicg use_precond=False, use_rcm=True, sym=False | 0.07641232 | 3.88 |
iterative-bicg use_precond=False, use_rcm=False, sym=False | 0.07933478 | 4.03 |
lu | 0.01969354 | 1.00 |
bm_mat = benchmark_steadystate_solvers(6, large_solvers, bm_problem5)
show_bm_mat(bm_mat, large_solvers)
Failure in iterative use_precond=True, use_rcm=True, sym=False: Steadystate solver did not reach tolerance after 1000 steps. Failure in iterative use_precond=True, use_rcm=False, sym=False: Steadystate solver did not reach tolerance after 1000 steps. Failure in iterative-bicg use_precond=True, use_rcm=True, sym=False: Steadystate solver did not reach tolerance after 40960 steps. Failure in iterative-bicg use_precond=True, use_rcm=False, sym=False: Steadystate solver did not reach tolerance after 40960 steps.
Solver | Elapsed time | Ratio |
power use_umfpack=True | 10.34370623 | 8.90 |
power use_umfpack=False | 10.37572424 | 8.93 |
direct sparse use_umfpack=True | 1.16162479 | 1.00 |
direct sparse use_umfpack=False | 9.75404005 | 8.40 |
iterative use_precond=True, use_rcm=True, sym=False | nan | nan |
iterative use_precond=True, use_rcm=False, sym=False | nan | nan |
iterative-bicg use_precond=True, use_rcm=True, sym=False | nan | nan |
iterative-bicg use_precond=True, use_rcm=False, sym=False | nan | nan |
from qutip.ipynbtools import version_table
version_table()
Software | Version |
---|---|
Python | 3.3.2+ (default, Oct 9 2013, 14:50:09) [GCC 4.8.1] |
matplotlib | 1.3.1 |
QuTiP | 3.0.0.dev-0f20b2a |
Cython | 0.20.1 |
SciPy | 0.13.3 |
Numpy | 1.8.0 |
IPython | 2.0.0 |
OS | posix [linux] |
Thu Apr 03 17:04:46 2014 JST |