2022-02-22 14:00:57 +01:00
|
|
|
|
import pytest
|
|
|
|
|
import random
|
2022-03-22 10:25:58 +01:00
|
|
|
|
from hiro_models.two_qubit_model import *
|
2022-02-22 14:00:57 +01:00
|
|
|
|
from qutip import *
|
2022-03-18 15:34:32 +01:00
|
|
|
|
from utility import assert_serializable
|
2022-02-22 14:00:57 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class TestBasicConfigs:
|
|
|
|
|
def test_xx_zz(self):
|
|
|
|
|
model = TwoQubitModel(ω_2=2, γ=0.4, δ=[0.1, 0.2], s_vec=[[0, 1], [0, 1]])
|
|
|
|
|
assert_serializable(model)
|
|
|
|
|
|
|
|
|
|
assert model.local_system(0) == 1 / 2 * (tensor(sigmaz(), identity(2)))
|
|
|
|
|
assert model.local_system(1) == (tensor(identity(2), sigmaz()))
|
|
|
|
|
|
|
|
|
|
for j in [1, 1000]:
|
|
|
|
|
model.j[0, 0] = j
|
|
|
|
|
assert model.system == 1 / 2 * (
|
|
|
|
|
tensor(sigmaz(), identity(2)) + tensor(identity(2), sigmaz()) * 2
|
|
|
|
|
) + 0.4 / 2 * tensor(sigmax(), sigmax())
|
|
|
|
|
|
|
|
|
|
for s in [1, 10]:
|
|
|
|
|
model.s_vec[0][1] = s
|
|
|
|
|
model.s_vec[1][1] = s
|
|
|
|
|
|
|
|
|
|
assert model.bath_coupling(0) == tensor(sigmaz(), identity(2))
|
|
|
|
|
assert model.bath_coupling(1) == tensor(identity(2), sigmaz())
|
|
|
|
|
|
2022-03-21 13:40:20 +01:00
|
|
|
|
assert model.bcf_scale(0) == 0.1 ** 2
|
|
|
|
|
assert model.bcf_scale(1) == 0.2 ** 2
|
2022-02-22 14:00:57 +01:00
|
|
|
|
|
|
|
|
|
def test_xy_zz(self):
|
|
|
|
|
model = TwoQubitModel(ω_2=0.11, γ=10, δ=[23, 123], s_vec=[[0, 1], [0, 1]])
|
|
|
|
|
model.j[0, 0] = 0
|
|
|
|
|
model.j[0, 1] = 123
|
|
|
|
|
|
|
|
|
|
assert_serializable(model)
|
|
|
|
|
|
|
|
|
|
for j in [1, 1000]:
|
|
|
|
|
model.j[0, 1] = j
|
|
|
|
|
assert model.system == 1 / 2 * (
|
|
|
|
|
tensor(sigmaz(), identity(2)) + tensor(identity(2), sigmaz()) * 0.11
|
|
|
|
|
) + 10 / 2 * tensor(sigmax(), sigmay())
|
|
|
|
|
|
|
|
|
|
for s in [1, 10e4]:
|
|
|
|
|
model.s_vec[0][1] = s
|
|
|
|
|
model.s_vec[1][1] = s
|
|
|
|
|
|
|
|
|
|
assert model.bath_coupling(0) == tensor(sigmaz(), identity(2))
|
|
|
|
|
assert model.bath_coupling(1) == tensor(identity(2), sigmaz())
|
|
|
|
|
|
|
|
|
|
def test_yx_zx(self):
|
|
|
|
|
model = TwoQubitModel(ω_2=0.11, γ=10, δ=[23, 123], s_vec=[[0, 1], [1, 0]])
|
|
|
|
|
model.j[0, 0] = 0
|
|
|
|
|
model.j[1, 0] = 123
|
|
|
|
|
|
|
|
|
|
assert_serializable(model)
|
|
|
|
|
|
|
|
|
|
for j in [1, 1000]:
|
|
|
|
|
model.j[1, 0] = j
|
|
|
|
|
assert model.system == 1 / 2 * (
|
|
|
|
|
tensor(sigmaz(), identity(2)) + tensor(identity(2), sigmaz()) * 0.11
|
|
|
|
|
) + 10 / 2 * tensor(sigmay(), sigmax())
|
|
|
|
|
|
|
|
|
|
for s in [1, 10e4]:
|
|
|
|
|
model.s_vec[0][1] = s
|
|
|
|
|
model.s_vec[1][0] = s
|
|
|
|
|
|
|
|
|
|
assert model.bath_coupling(0) == tensor(sigmaz(), identity(2))
|
|
|
|
|
assert model.bath_coupling(1) == tensor(identity(2), sigmax())
|
|
|
|
|
|
|
|
|
|
def test_yx_xz(self):
|
|
|
|
|
model = TwoQubitModel(ω_2=0.11, γ=10, δ=[23, 123], s_vec=[[1, 0], [0, 1]])
|
|
|
|
|
model.j[0, 0] = 0
|
|
|
|
|
model.j[1, 0] = 123
|
|
|
|
|
|
|
|
|
|
assert_serializable(model)
|
|
|
|
|
|
|
|
|
|
for j in [1, 1000]:
|
|
|
|
|
model.j[1, 0] = j
|
|
|
|
|
assert model.system == 1 / 2 * (
|
|
|
|
|
tensor(sigmaz(), identity(2)) + tensor(identity(2), sigmaz()) * 0.11
|
|
|
|
|
) + 10 / 2 * tensor(sigmay(), sigmax())
|
|
|
|
|
|
|
|
|
|
for s in [1, 10e4]:
|
|
|
|
|
model.s_vec[0][0] = s
|
|
|
|
|
model.s_vec[1][1] = s
|
|
|
|
|
|
|
|
|
|
assert model.bath_coupling(0) == tensor(sigmax(), identity(2))
|
|
|
|
|
assert model.bath_coupling(1) == tensor(identity(2), sigmaz())
|
|
|
|
|
|
|
|
|
|
def test_xz_xz(self):
|
|
|
|
|
model = TwoQubitModel(ω_2=0.11, γ=10, δ=[23, 123], s_vec=[[1, 0], [0, 1]])
|
|
|
|
|
model.j[0, 0] = 0
|
|
|
|
|
|
|
|
|
|
assert_serializable(model)
|
|
|
|
|
|
|
|
|
|
for j in [1, 1e5]:
|
|
|
|
|
model.j[0, 2] = j
|
|
|
|
|
assert model.system == 1 / 2 * (
|
|
|
|
|
tensor(sigmaz(), identity(2)) + tensor(identity(2), sigmaz()) * 0.11
|
|
|
|
|
) + 10 / 2 * tensor(sigmax(), sigmaz())
|
|
|
|
|
|
|
|
|
|
for s in [1, 10e4]:
|
|
|
|
|
model.s_vec[0][0] = s
|
|
|
|
|
model.s_vec[1][1] = s
|
|
|
|
|
|
|
|
|
|
assert model.bath_coupling(0) == tensor(sigmax(), identity(2))
|
|
|
|
|
assert model.bath_coupling(1) == tensor(identity(2), sigmaz())
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_sd_bcf_norm():
|
|
|
|
|
random.seed(0)
|
|
|
|
|
for _ in range(4):
|
|
|
|
|
model = TwoQubitModel(
|
|
|
|
|
ω_c=[random.uniform(0.5, 4), random.uniform(0.5, 4)],
|
|
|
|
|
s=random.choices([1.0, 0.1, 0.5, 0.3], k=2),
|
|
|
|
|
T=[random.uniform(0.1, 4), random.uniform(0.1, 4)],
|
|
|
|
|
)
|
2022-02-22 14:52:56 +01:00
|
|
|
|
assert_serializable(model)
|
2022-02-22 14:00:57 +01:00
|
|
|
|
|
|
|
|
|
for i in range(2):
|
|
|
|
|
assert model.spectral_density(i).integral() == pytest.approx(np.pi)
|
|
|
|
|
assert model.bcf(0)(0) == 1
|
2022-03-21 13:40:20 +01:00
|
|
|
|
assert np.sum(model.bcf_coefficients()[0][i]) == pytest.approx(1, rel=1e-2)
|
2022-02-22 14:00:57 +01:00
|
|
|
|
|
|
|
|
|
tsd = model.thermal_spectral_density(i)
|
|
|
|
|
assert tsd is not None
|
|
|
|
|
assert pytest.approx(tsd(1)) == model.spectral_density(i)(1) * 1 / np.expm1(
|
|
|
|
|
1 / float(model.T[i])
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
tcorr = model.thermal_correlations(i)
|
|
|
|
|
assert tcorr is not None
|
|
|
|
|
|
|
|
|
|
# tests if the normalization of tcorr is correct by
|
|
|
|
|
# calculating the fourier transform
|
|
|
|
|
model.thermal_process(i)
|