two_qubit_model/test_two_qubit_model.py

138 lines
4.7 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import pytest
import random
from hiro_models.two_qubit_model import *
from qutip import *
from utility import assert_serializable
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())
assert model.bcf_scale(0) == 0.1 ** 2
assert model.bcf_scale(1) == 0.2 ** 2
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)],
)
assert_serializable(model)
for i in range(2):
assert model.spectral_density(i).integral() == pytest.approx(np.pi)
assert model.bcf(0)(0) == 1
assert np.sum(model.bcf_coefficients()[0][i]) == pytest.approx(1, rel=1e-2)
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)