In [1]:
import cutiepy
cutiepy.interactive.INTERACTIVE = False
cutiepy.operators.SPARSITY_N_CUTOFF = 1000
import qutip
qutip_rhs_reuse = True
import numpy as np
import scipy
%matplotlib inline
import matplotlib.pyplot as plt
n_small_cutoffs = list(range( 2, 10 ))
n_med_cutoffs = list(range( 10, 100, 10))
n_big_cutoffs = list(range(100, 600, 100))
ns = [n_small_cutoffs, n_med_cutoffs, n_big_cutoffs]
periods = [100, 10, 1]
def cutiepy_sym_state(n):
return cutiepy.Ket.anon([n], np.ones((n,1), dtype=complex)/n**0.5)
def qutip_sym_state(n):
return qutip.Qobj(np.ones((n,1), dtype=complex)/n**0.5)
from timeit import repeat
setup = '''
import cutiepy
cutiepy.interactive.INTERACTIVE = False
cutiepy.operators.SPARSITY_N_CUTOFF = 1000
import qutip
qutip_rhs_reuse = True
import numpy as np
import scipy
def cutiepy_sym_state(n):
return cutiepy.Ket.anon([n], np.ones((n,1), dtype=complex)/n**0.5)
def qutip_sym_state(n):
return qutip.Qobj(np.ones((n,1), dtype=complex)/n**0.5)
'''
def parametric_timeit(ex_, setup_, params):
res = []
for _ns, _p in zip(ns, params):
_res = []
for _n in _ns:
print('\r p=%d, n=%d'%(_p,_n), end='', flush=True)
_r = repeat(ex_, setup+setup_.format(param=_p, N_cutoff=_n),repeat=5,number=1)
_res.append(_r)
res.append(_res)
print('\r Done!')
return res
def plot_times(datas, labels):
datas = [[np.array([sorted(_runs) for _runs in _vsn]) for _vsn in data]
for data in datas]
plt.figure(figsize=(14,3))
for data in datas:
plt.subplot(1,3,1)
plt.plot(n_small_cutoffs, data[0][:,0], 'o')
plt.subplot(1,3,2)
plt.plot(n_med_cutoffs, data[1][:,0], 'o')
plt.subplot(1,3,3)
plt.plot(n_big_cutoffs, data[2][:,0], 'o')
plt.subplot(1,3,1)
plt.ylabel('seconds')
plt.xlabel('problem dimension')
plt.title('%d periods'%periods[0])
plt.subplot(1,3,2)
plt.title('%d periods'%periods[1])
plt.subplot(1,3,3)
plt.legend(labels, loc=2)
plt.title('%d period'%periods[2])
In [3]:
setup_q = '''
ts = np.linspace(0,{param}*np.pi,{param}*10)
init = qutip_sym_state({N_cutoff})
H = qutip.num({N_cutoff})
opt = qutip.Options(rhs_reuse=qutip_rhs_reuse, nsteps=1000*{N_cutoff})
'''
ex_q = '''
res = qutip.sesolve(H,init,ts,[], options=opt)
'''
HARM_OSC_SYM_STATE_qutip = parametric_timeit(ex_q, setup_q, periods)
In [16]:
setup_c = '''
ts = np.linspace(0,{param}*np.pi,{param}*10)
init = cutiepy_sym_state({N_cutoff})
H = cutiepy.num({N_cutoff})
mxsteps = 1000*{N_cutoff}
'''
ex_c = '''
res = cutiepy.sesolve(H,init,ts, mxsteps=mxsteps)
'''
HARM_OSC_SYM_STATE_cutiepy = parametric_timeit(ex_c, setup_c, periods)
In [26]:
plot_times([HARM_OSC_SYM_STATE_cutiepy, HARM_OSC_SYM_STATE_qutip], ['cutiepy', 'qutip'])
In [42]:
setup_q = '''
ts = np.linspace(0,{param}*np.pi/10,{param}*10)
init = qutip_sym_state({N_cutoff})
H0 = qutip.zero_oper({N_cutoff})
H = qutip.num({N_cutoff})
tdep = 't/({param}*np.pi)'
opt = qutip.Options(rhs_reuse=qutip_rhs_reuse, nsteps=1000*{N_cutoff})
'''
ex_q = '''
res = qutip.mesolve([H0,[H,tdep]],init,ts,[],[], options=opt)
'''
HARM_OSC_RAMP_SYM_STATE_qutip = parametric_timeit(ex_q, setup_q, periods)
In [45]:
setup_c = '''
ts = np.linspace(0,{param}*np.pi/10,{param}*10)
init = cutiepy_sym_state({N_cutoff})
H = cutiepy.num({N_cutoff})*cutiepy.t/({param}*np.pi)
mxsteps = 1000*{N_cutoff}
'''
ex_c = '''
res = cutiepy.mesolve(H,[],init,ts, mxsteps=mxsteps)
'''
HARM_OSC_RAMP_SYM_STATE_cutiepy = parametric_timeit(ex_c, setup_c, periods)
In [46]:
plot_times([HARM_OSC_RAMP_SYM_STATE_cutiepy, HARM_OSC_RAMP_SYM_STATE_qutip], ['cutiepy', 'qutip'])
In [ ]: